结构体的嵌套:
结构体定义中,结构体的成员又是另外一个结构体变量
结构体的嵌套的注意事项:
1)结构体定义中可以嵌套其他结构体类型的变量
不可以嵌套自己这个类型的变量
struct Date{
int month;
int year;
int day;
};
struct Student {
char *name;
int age;
float score;
struct Student stu; //错误的
}
2)可以嵌套自己类型的指针
#include <stdio.h>
//定义了一个时间的结构体
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 Date birthday;
//struct Student stu; //错误的
//struct Student *stu; //正确的
};
int main(int argc, const char * argv[]) {
//1、嵌套的结构体如何进行初始化
struct Student stu1={"张三丰",28,59.99f,{1200,2,14,{12,12,12}}}; //定义了一个结构体变量
//2、嵌套的结构体如何进行访问
printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.score);
//访问时间
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.time.sec,stu1.score);
//3、结构体嵌套自身的指针
struct Person {
char *name;
int age;
//嵌套自己类型的指针
struct Person *child;
};
//结构体嵌套自身指针的,初始化
//定义kim
struct Person kim={"kim",8,NULL};
//struct Person *child = &kim;
struct Person p1={"林志颖",38,&kim};
//结构体嵌套自身指针的,访问
printf("%s 的儿子是:%s,儿子的年龄:%d\n",p1.name,p1.child->name,p1.child->age);
return 0;
}
6.结构体变量及成员作为函数参数
成员值做函数的参数:结构体成员属性作为函数的参数就是值传递(成员变量是数组除外)
结构体变量名作为函数的参数:
在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这是由实参传向形参的只是地址,从而减少了空间和时间的开销。
#include <stdio.h>
struct Car{
int lunzi;
int speed;
};
void xiuche(int n){
n = 2;
}
//用结构体变量作为函数的参数
void xiuche1(struct Car c1){
c1.lunzi = 2;
}
int main(int argc, const char * argv[]) {
//定义一个结构体变量
struct Car car1={4,200};
//car1.lunzi 结构体变量成员值 4
//1、用结构体变量的成员值作为函数的参数,实质是值传递
xiuche(car1.lunzi);
//2、用结构体变量作为函数的参数
//实质上还是值传递
xiuche1(car1);
printf("%d\n",car1.lunzi); //4
return 0;
}
7.结构指针作为函数的参数
#include <stdio.h>
struct Car{
int lunzi;
int speed;
};
/**
* 结构体指针作为函数的参数
*
* @param c1 是一个结构体指针
*/
void xiuche2(struct Car *c1){
c1->lunzi = 2;
}
int main(int argc, const char * argv[]) {
//定义一个结构体变量
struct Car car1={4,200};
//注意:用结构体变量的地址传递给函数
// 也可以理解为用结构体指针作为函数的参数
// 实质:是地址传递
xiuche2(&car1);
printf("%d\n",car1.lunzi); //2
return 0;
}
|