DAY16-结构体
一、结构体
1.定义结构体类型变量
一般形式:
struct 结构体名 结构体名:谷歌编程规范规定,首字母必须大写
{
成员列表
}变量名表列; ;不能省略
eg:
struct Student
{int id;char name[100];float score;
}s;
2.结构体变量的引用
一般形式:
结构体变量名.成员名
eg:
Student.ld = 1
3.结构体变量的初始化
struct Student s = {1, "zhangsan", 99.7};
结构体的初始化顺序必须与声明的顺序保持一致
4.结构体的嵌套
结构体的声明允许嵌套
(1)结构体的嵌套调用
struct Date
{int year;int month;int day;
}struct Student
{int id;char name[100];float score;struct Date Birthday;
};
(2)结构体的嵌套的引用
Student.birthday.year = 2003;
(3)结构体的嵌套的初始化
struct Student s = {1,"zhangsan",99.7,{2003,07,03},};
C99语法后可以进行部分初始化
struct Student s = {.ld = 1,.score = 99.7',{.month = 5,}};
5.结构体数组
struct Student a[3] = {{1, "zhangsan", 98.5},{2, "lisi", 97.5},{3, "wangwu",99.900},};
6.指向结构体类型数据的指针
(1)定义
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。
以下为3种等价的书写方式:
①结构体变量名.成员名
②(*p).成员名
③p->成员名
(3)例题
①逆序
void swap(struct Student *a, struct Student *b)
{struct Student t = *a;*a = *b;*b = t;}void reverseStudent(struct Student *s, int len)
{int i;for(i = 0;i < len / 2;++i){swap(s + i, s + len - i - 1);}
}
②排序
int namecmp(struct Student *p1, struct Student *p2)
{return strcmp(p1->name, p2->name);
}int scorecmp(struct Student *p1, struct Student *p2)
{if((p1->score - p2->score) > 0){return 1;}else if((p1->score - p2->score) == 0){return 0;}else{return -1;}
}void sortStudent(struct Student *a, int len, int (*pfn)(struct Student *, struct Student *))
{int i, j;for(i = 0;i < len - 1;++i){for(j = i + 1;j < len;++j){if(pfn(a + i, a + j) > 0){swap(a + i, a + j);}}}
}
注:以上程序均无主函数。
7.结构体的存放规则
①默认按CPU位数对齐:(8字节最终大小必须是8的整数倍)
②在结构体成员中找出最长成员,最终按照该成员长度对齐
③按照结构体声明的顺序,依次将成员保存到结构体内存中,保存的偏移量 / sizeof(成员)== 0
eg:
struct Student
{int s;char a;short f;
};
占8个字节
struct Student
{char a;int s;short f;
};
占12个字节