结构体:可以由多个不同类型的数据构成
数组:只能存放一种数据类型
- 也是一种数据类型;构造类型;数组也是一种构造类型;
- 数组同时只能存放一种数据类型;
- 字符串存放的两种方法:字符串数组和指针数组;
- 结构体:可以由多个不同类型的数据构成;
- 第一步定义结构体类型;第二步是根据结构体类类型,定义结构体变量;
- struct Person{ int age;double height;char *name;};定义了person结构体类型;里面的变量可以成员或属性;
- char *name;是指针变量存放地址;
- struct Person p;根据结构体类型,定义结构体变量;
- struct Person p={20,1.55,"jack"};
- p.age=30;代表给age赋值;有点面向对象的味道;
- 只能在定义结构体变量的同时给它赋值;因为结构体名是一个地址;不能随便改变结构体名的地址;如错误写法:struct Person p2;p2= {30,1.67,"jake"};正确写法:struct Person p2= {30,1.67,"jake"};也可以写成:struct Person p2= {.height=1.55,.age= 20,.name="jake"};
结构体内存分析;从上往下分配;
- 定义结构体类型的时候没有定义变量,所以没有分配存储空间;如struct Date{int year;int month;int day;};这一句就没有分配存储空间;
- 结构体所占用的字节是结构体类型中成员的字节和;
- struct Date是一个结构体类型,还没有结构体变量;
- 查看字节的地址:printf("%p - %p - %p ",&d1.year,&d1.month,&d1.day);
- 结构体变量赋值给结构体变量,会将d1所有成员的值对应地赋值给d2的值;
- 补齐算法;(对齐算法)结构体占用的字节数必须是最大成员字节的倍数;
- struct Student{int age;char *name;};所以这个由16个字节;
结构体注意点和其他用法:
- 定义结构体类型不分配存储空间;变量类型写左边;变量名写右边
- struct Student{int age;double height; char *name;}stu;这句代码写了两个意思;其中定义了结构体类型;还利用新定义好的类型来定义结构体变量;(定义类型的同时定义变量);这是定义变量的第二种方式;
- 结构体类型不能重复定义;
- 不写结构体类型名的方法;struct {int age;char *name;}stu;第三种方法;
- 三种定义结构体变量的方法:先定义类型,再定义变量;定义类型的同时定义变量;定义了类型的同时定义变量(省略了类型名称)
- 结构体类型有作用范围;程序员自定义的一般都有范围限制;
- 如果想写一个类型在任何地方都能用,那么需要把它在程序外面;
- 在全局可以定义一个结构体;在函数内部也可以重复定义一个结构体;
结构体数组;
- 之前有指针数组;字符串数组;
- 类似积分排行榜;struct RankReord{int no;char *name;int score;}
- 结构体数组的类型写法:struct RankRecord records[3]={{1,"jack",5000},{2,"jim",500},{3,"jake",300}};
- 在使用for循环输出给用户看:for(int i = 0;i<3;i++){printf("%d %s %d ",records[i].no,recores[i].name,records[i].score);}
结构体的嵌套
- 多次使用同一个结构体的时候使用;
- struct Date{int year;int month;int day;}; struct Student{int no;struct Date birthday;struct Date ruxueDate;} struct Student stu={1,{200,9,10},{2012,9,10}};
- 输出:printf("year=%d,month=%d,day=%d ",stu.birthday.year,stu.birthday.month,stu.birthday.day);
- 指针变量指向结构体;struct Student *p;p=&stu;
- 用了指针之后,访问方式的变化;
- printf("age=%d,no=%d ",(*p).age,(*p).no);
- 第三种方式访问:printf("age=%d,no=%d ",p->.age,p->.no);
- ->是用在指针结构体身上的;->的作用是直接找到我们p指向的结构体;
- p->age =30;直接这样就可以修改值;
- 指向结构体的指针的定义;struct Student *p;
- 利用指针访问结构体的成员;(*p).成员名称;p->成员名称;
- 共用体