1)结构指针定义和初始化
a、指向结构体变量的指针
①一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。
②一般形式:
struct 结构名 *结构指针变量名
与前面的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。
赋值是把结构体变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
③什么是结构体指针?
用来存放结构体变量地址的指针变量。
④结构体指针定义
格式:
struct 结构体名 *指针变量名
代码:
struct Car{
int lunzi;
int speed;
};
b、结构名、结构体变量名、结构体指针
结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。结构指针变量,就是用来存储结构体变量地址的,就能更方便地访问结构变量的各个成员。
2)结构体指针间接访问成员值
a、指向结构体变量的指针
其访问的一般形式为:
(*结构体指针变量).成员名
例如:
(*pstu).num
或:
结构指针变量->成员名
例如:
pstu->num
b、结构体变量的成员值
struct Stuent{
int age;
char *name;
};
struct Stuent stu1={17,"张三"};//成员值有两个①stu1.age ②stu1.name
c、用结构体指针间接访问结构体变量的成员值
struct Student *p=&stu1;
//使用p 获取 18 和 张三丰
两种方法:
方法一:
①(*p).age;//访问年龄
②(*p).name;//访问姓名
需要注意:(*p)两侧的括号不可少,因为成员符"."的优先级高于"*".
如果去掉括号写作*p.age则等效于*(p.age),这样意义就完全不对了。
方法二:
①p->age //访问年龄
②p->name //访问姓名
3)结构体嵌套使用
a、结构体嵌套使用
成员也可以又是一个结构,即构成了嵌套的结构。
结构体嵌套:结构体定义的里面有其他结构体。
结构体不可以嵌套自己的变量,但是可以嵌套指向自己这种类型的指针。
b、注意事项:
①结构体定义中可以嵌套其他结构体类型的变量;
②结构体定义中不可以嵌套自己这个类型的变量;
③可以嵌套自己类型的指针
例如:
//定义一个Date的结构体
struct Date{
int year;
int month;
int day;
};
//定义了一个学生的结构体
struct Student{
char *name;
int age;
float score;
//错误写法 struct Student stu;//这种写法是错误的,不能在自己说嵌套自己类型的结构
struct Student *stu;//这种写法是正确的
struct Date birthday;
};
c、嵌套结构体如何进行初始化
struct Student stu1={"张三丰",19,80f,{1991,12,12}};//定义了一个结构体变量
d、嵌套的结构体如何进行访问
printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day);
c、多级嵌套
例如:
//定义一个Time的结构体
struct Time{
int hour;
int min;
int sec;
};
//定义一个Date的结构体
struct Date{
int year;
int month;
int day;
//嵌套time结构体
struct Time time;
};
//定义了一个学生的结构体
struct Student{
char *name;
int age;
float score;
//错误写法 struct Student stu;//这种写法是错误的,不能在自己说嵌套自己类型的结构
struct Student *stu;//这种写法是正确的
struct Date birthday;
};
c、嵌套结构体如何进行初始化
struct Student stu1={"张三丰",19,80f,{1991,12,12,{12,12,12}}};//定义了一个结构体变量
d、嵌套的结构体如何进行访问
printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d %02d:%02d:%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.birthday.time.hour,stu1.birthday.time.min,stu1.birthday.sec,stu1.score);
4)结构体嵌套自身的指针
struct Person{
char *name;
int age;
//嵌套自己类型的指针
struct Person *child;
};
//结构体嵌套自身指针的初始化
//定义kim
struct Person kim={"Kimmy",8,NULL};
//struct Person *child=&kim;
struct Person p1={"林志玲",30,&kim};
//结构体 嵌套自身指针的访问
printf("%s的儿子是:%s,儿子的年龄是:%d\n",p1.name,(*p1.child).name,(*p1.child).age);
或者:
printf("%s的儿子是:%s,儿子的年龄是:%d\n",p1.name,p1.child->name,p1.child->age);
|
|