构造类型:由一个或多个已定义类型的元素,用构造的方法,构造新的类型
构造类型:数组、结构体
一、结构体
1、概念:由相同类型或者不同类型的数据,用构造方法构造起来的
2、定义:
struct 结构名{
成员列表
};
3、三种定义方法:
(1)先定义结构体,然后再定义结构体变量
struct Student(){
//学生学号
int sno;
//学生姓名
char name[10];
//学生年龄
int age;
//学生成绩
float score;
}
注意:
1)结构体定义完成之后,计算机并不会给结构体分配内存空间
2)会在定义结构体变量后,分配存储空间
//结构体变量定义格式:
struct 结构体名 结构体变量名;
struct Student stu1; //这句话表示定义一个Student结构体类型的变量,变量名称是stu;
//stu1因为是Student类型,stu可以存放学生的学号、姓名、年龄、成绩
(2)定义结构体的时候,定义结构体变量
格式:
struct 结构体名{
}结构体变量1,结构体变量2....;
(3)使用匿名结构体定义结构体变量
格式:
struct {
...
}car1,car2...;
3、三种初始化方法
(1)定义的同时初始化
(2)先定义后初始化
(3)定义的同时,指定元素初始化
二、结构体数组
1、概念及定义
(1)概念:用来存放大量结构相同的结构体变量
(2)定义:
1、定义的同时,定义数组
struct Student{
int age;
char *name;
int sno;
float score;
}stu[5];
2、先定义结构体,后定义数组
struct Student boy[5];
2、初始化和遍历
(1)初始化
1、定义结构体数组的时候,进行初始化
struct Student{
char name[20];
int age;
}boys[3]={{“sb”,18},{“zbz”,”38”},{“fd”,20}};
2、定义的同时进行初始化
struct Student girls[2]={{“feng”,10},{“fasd”,55}};
3、先定义,后初始化
struct Student ds[2];
ds[0]=(struct Student){“fdas”,22};
ds[1]=(struct Student){“das”,11}
4、先定义结构体数组,后初始化
struct Student stu[2];
//错误的:stu[0].name=”zhangsan”;
//正确的:strcpy(“%s”,stu[0].name);
scanf(“%s”,stu[0].name);
stu[0].age=18;
(2)遍历
for(int i=0;i<3;i++){
Printf(boys[i].name,boys[i].age);
}
三、结构体指针
1、概念,定义及初始化
(1)概念:用来存放结构体变量地址的指针变量
(2)定义:
struct 结构体名 *指针变量名;
struct Car{
int lunzi;
int speed;
}car1;
struct Car *p=NULL; //定义一个结构体指针变量
p=&car1; //错误的 p=&Car
2、结构体指针间接访问成员值
例:
struct Student stu={8,”张三丰”};
struct Student *p=&stu;
方法(1):(*p).age //访问年龄
printf(“姓名:%s\n”,(*p).name);
方法(2):p->age //访问年龄
printf(“姓名:%s\n”,p->name);
四、结构体的嵌套使用
1、概念:结构体定义中,结构体的成员又是另外一个结构体变量。
2、注意:
(1)结构体定义中可以嵌套其他结构体类型的变量
(2)不可以嵌套自己这个类型的变量
//定义一个Date的结构体
struct Date{
int year;
int month;
int day;
}
//创建一个Student的结构体
struct Student{
char *name;
int age;
float score;
//struct Student stu; //错误的
//struct Student *stu; //正确的
struct Date birthday;
}
(3)可以定义自己类型的结构体指针变量。
3、初始化:
struct Student stu1={“张三丰”,28,55.99f,{1200,,12,12}};
4、访问:
(1)使用其他构造体的变量:
printf(“姓名:%s,年龄:%d(生日:%d-%02d-%02d),成绩:%.2f\n”,
stu1.name,stu1.age,stu1.birthday.year,tu1.birthday.month,tu1.birthday.day,stu1.score);
(2)使用嵌套体自身的指针的初始化及访问
struct Person{
char *name;
int age;
//嵌套自己类型的指针
struct Person *child;
};
//定义小孩
struct Person kimi={“kimi”,8,NULL};
struct Person p1={“林志颖”,38,&kimi};
//访问
printf(“%s的儿子是%s,儿子的年龄是%d\n”,
p1.name,(*p1.child).name,(*p1.child).nge);
5、结构体变量及成员作为函数参数
(1)用结构体变量作为函数的参数
实质上还是值传递,修改不了对应地址上的内容。
(2)结构体指针作为函数的参数
可以修改对应地址上的内容。 |
|