1. 首页
  2. 文档大全

C知识点总结结构体指针使用.doc

上传者:蓝天 2022-06-19 21:45:50上传 DOC文件 88 KB
位操作:熟悉& r «»操作。应聘嵌入式c开发的岗位会考这方面的知识。见实验5。
结构体共用体
如前面讲的,作为函数参数和返回值,结构体是值传递。结构体变量之间可以直接赋值, 结构体在初始化时才能整体赋值。
C99里新的结构体初始化方法。初始化结构体的指定成员变量。见《C primer p山s》P382
struct book{char a; int b; double c ); struct book surprise ={ .b=3 };即初始化指定的 成员变量b,其他成员变量的值赋值为0。在内核驱动代码中会经常见到。
指向结构体的指针及使用
struct node (int data; struct node *next; } nodel;
struct node *point=&nodel;
内存模型
高地址
next
[point ]
> nodel
data
此时,point指向nodelo
即* point和nodel对应的是同一块内存。
(*point).data等价于nodel.data对应的是同一块内存。
(*point).next等价于nodel.next对应的是同一块内存。即黄色背景的内存。
point->next
为什么这段代码行得通:
int offset= &( ( (struct book*) 0 )->b); //获得成员变量b在结构体的偏移量。
等价于:struct book *ptr=NULL; int offset= & ( ptr->b); // &(*ptr).b;
编译器维护关于每个结构类型的信息,指示每个字段的字节偏移。它以这些偏移作为存 储器引用指令中的移位,从而产生对结构元素的引用的代码。结构体的各个字段的选取完全 是在编译时处理的。参考《深入理解》P166页中的一个例子。
程序对内存的访问,都是先生成该内存的地址,再访问该内存。
结构体对齐,及填充
结构体的对齐与填充
C语言标准未严格规定该如何对齐,不同系统的对齐策略略有不同。
参考《深入理解》P170数据对齐。
linux 策略:linux/IA32 (Intel Architecture 32)下,基本类型按其占用字 节大小对齐。(即该类型变量的首地址能被sizeof (类型)整除,基本类型是指泛 整形和浮点类型)。
无论数据是否对齐,IA32硬件都能正确工作。不过,Intel还是建议要对齐数据以提高存储 器系统的性能.Linux沿用的对齐策略是,2字节数据类型(例如short)的地址必须是2的倍 数,而较大的数据类型(例如i志 int*、float和double)的地址必须是4的倍数。注意, 疝要求就意味着一个short类型对象的地址最低位必须等于0。类似地,任何蓦顷型的对 象或指针的地址的最低两位必须都是0.
结构体按其最大成员变量的对齐规则对齐。若结构体按n个字节对齐,那 么结构体的大小也要能被n整除。
结构体内的成员按上图的方式对齐。
struct S{ int a; char b; };该结构体按其最大成员int的对齐规则对齐。
结构体struct S按4个字节对齐,即它的首地址和大小必须都能被4整除。
因为有对齐的要求就出现了内存填充(空着若干个字节,不使

C知识点总结结构体指针使用


文档来源:https://www.taodocs.com/p-690297501.html

文档标签:

下载地址