9.指针:
(1)const指针
const 关键字 常量(只读)
1.const int *p;
2.int const *p;
1和2是等价的
const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值
3.int *const p;
const修饰 p,指针变量p的值不能改变,但可以利用指针变量p修改指向空间中的值
一定要对指针初始化
4.const int *const p;
5.int const *const p;
4和5是等价的
const修饰p和*p,指针变量p的值不能改变,也不能利用*p改变直系那个空间中的值
2.void
void a;
int *、double *、char * 转换为 void * 需要强制类型转换(高精度转为低精度)
void *转换为int *、double *、char *不需要强制类型转换(低精度转为高精度)
strcpy 拷贝字符串
memcpy 拷贝一段内存空间
10.函数指针和指针函数:
指针函数:是函数,函数的返回值类型是指针类型
函数指针:是指针,指针指向了函数
(1)指针函数:
局部变量的地址不能返回,因为局部变量会随函数作用域结束被回收,虽然能够获得返回的地 址,但地址对应的空间已经被回收过了
将函数的返回值作为下一个函数的参数
(2)函数指针:
int (*Fun)(int a, int b) = NULL;
定义函数指针变量Fun,占8个字节空间,指向int返回值有2个int参数的函数
11.C语言中二级指针使用场景:
(1)指针数组传参时:
char *str[5];
int Fun(char **ppstr, int len);
(2)函数体内想修改函数体外指针变量值的时候,要传递指针变量的地址即二级指针
char *p = NULL;
int Fun(char **pp);
构造数据类型
数据类型:
(1)基本数据类型:
int
double
char
(2)构造数据类型:
1.struct 结构体
2.union 共用体
3.enum 枚举
1.结构体:
(1)结构体类型的定义
struct 结构体名
{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
..
};
(2)结构体变量的定义
数据类型 变量名;
数据类型 *指针变量名;
(3)结构体变量的初始化:
1.全部初始化:
struct student s = {"zhangsan", 'm', 19, 100};
2.局部初始化:
struct student stu = {
.name = "lisi",
.score = 90,
};
(4)结构体成员变量的访问:
. :结构体变量类型访问成员变量使用 .
-> :结构体指针类型访问成员变量使用 ->
整体类型由成员变量类型决定
#include <stdio.h>
struct student
{
char name[32];
char sex;
int age;
int score;
};
struct time
{
int hour;
int min;
int sec;
};
struct date
{
int year;
int mon;
int day;
};
struct datetime
{
struct date day;
struct time t;
};
int main(void)
{
struct student s = {"zhangsan", 'm', 19, 90};
struct student *p = NULL;
struct datetime dt = {{2024, 1, 29}, {15, 51, 30}};
struct datetime *pdt = NULL;
struct student stu = {
.name = "lisi",
.score = 100,
};
struct datetime now = {
.day = {
.year = 2024,
.day = 29,
},
.t = {
.hour = 16,
.min = 34,
},
};
printf("姓名:%s\n", s.name);
printf("性别:%c\n", s.sex);
printf("年龄:%d\n", s.age);
printf("成绩:%d\n", s.score);
printf("姓名:%s\n", (&s)->name);
printf("性别:%c\n", (&s)->sex);
printf("年龄:%d\n", (&s)->age);
printf("成绩:%d\n", (&s)->score);
p = &s;
printf("姓名:%s\n", p->name);
printf("性别:%c\n", p->sex);
printf("年龄:%d\n", p->age);
printf("成绩:%d\n", p->score);
printf("姓名:%s\n", (*p).name);
printf("性别:%c\n", (*p).sex);
printf("年龄:%d\n", (*p).age);
printf("成绩:%d\n", (*p).score);
printf("%d-%d-%d %d:%d:%d\n", dt.day.year, dt.day.mon, dt.day.day, dt.t.hour, dt.t.min, dt.t.sec);
pdt = &dt;
printf("%d-%d-%d %d:%d:%d\n", pdt->day.year, pdt->day.mon, pdt->day.day, pdt->t.hour, pdt->t.min, pdt->t.sec);
return 0;
}
作业:
1.定义一个结构体包含年-月-日三个成员
struct date
{
int year;
int mon;
int day;
};
从终端接收年月日信息存放到结构体中,计算该天为该年的第几天?计算该年剩余多少天?打印年月日信息
2.封装一个函数,给定一个数字字符串转换成其对应的整形数
"123456"
123456
int MyAtoi(char *pstr);