C语言第十七次课 (结构体)
(1)结构体的定义
//注意是设计结构体而不是定义结构体, 因为定义变量要开辟空间, 而设计结构体不会给其开辟空间, 设计结构体时 “ ;” 分号是不可或缺的。
//结构体不占用存储空间 但由结构体定义的变量占存储空间。好比 int a=10可以而int=10不行,结构体同理。
(2)定义结构体时如何分配空间:
//对结构体变量的初始化使用花括号[ ],对数组也是[ ],两者的区别是:数组的每一个元素所占字节个数一样,类型也一样; 结构体每一个属性所占的字节个数可能不一样,类型不一样。 两者的相同点:若都分配10个空间,只初始化前面四个元素,后面的元素通通填0。
//结构体的初始化 是从上到下依次给定:
// const:我能指向你,但我不能改变你。
区分const char*s_id;和const s_id[8];结构的不同:前者为指针 后者为数组。
//指针前必须加const 因为指针可以调动这些字符串对其进行改变,所以需要用const限制其赋值能力,const char * s_id.
字符串前不用加const ,chars_id[10]即可 ,把字符串拷贝到这个空间 ,数组有空间每个量可以修改,所以数组前不加const。
(3)结构体的嵌套
(4)“不完整类型”:无法用sizeof计算大小:
此时x中含有studx结构体;
//无类型大小也无法计算即:sizeof(void)
如果把上面代码改为指针能否编译通过?
(5)结构体的指向:
结构体之间可以相互初始化:struct student s3=s1;和struct定义的类型无关。
结构体对成员的访问 用 “ .”
也可用指针的访问 两种形式“.” 和 “-> ” 中间没有空格 称为“指向符”
printf("%s \n",s1.s_name);
结构体与结构体指针的比较:
结构体指针效率更高,指针前要加const 只能读取你不能改变你,并且要加断言 判断不为空;
结构体不需要加断言与const;但效率比结构体指针要低。
(6)引用 :“别名”
引用的特点:1.必须给以初始化。2.与之对应 不存在空引用,引用不存在分级,和一级指针二级指针这种不同。
把引用 加入到结构体中 比指针更方便 因为不用判空。
引用的例题: