c语言结构体和文件操作知识点总结,C知识点总结结构体指针使用.pdf

位操作 :熟悉 & | ^ << >> 操作。应聘嵌入式 C 开发的岗位会考这方面的知识。见实验 5。

结构体 共用体

如前面讲的, 作为函数参数和返回值, 结构体是值传递。 结构体变量之间可以直接赋值,

结构体在初始化时才能整体赋值。

C99 里新的结构体初始化方法。 初始化结构体的指定成员变量。 见 《C primer plus 》P382

struct book{char a; int b; double c }; struct book surprise ={ .b=3 }; 即初始化指定的

成员变量 b ,其他成员变量的值赋值为 0。在内核驱动代码中会经常见到。

指向结构体的指针及使用

struct node { int data; struct node *next; } node1;

struct node *point=&node1;

内存模型

高地址

next

data

[ point ] > node1

此时, point 指向 node1 。即 *point 和 node1 对应的是同一块内存。

(*point).data 等价于 node1.data 对应的是同一块内存。

(*point).next 等价于 node1.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 (类型)整除,基本类型是指泛

整形和浮点类型) 。

结构体按其最大成员变量的对齐规则对齐。若结构体按 n 个字节对齐,那

么结构体的大小也要能被 n 整除。

结构体内的成员按上图的方式对齐。

struct S{ int a; char b; }; 该结构体按其最大成员 int 的对齐规则对齐。

结构体 struct S 按 4 个字节对齐,即它的首地址和大小必须都能被 4 整除。

因为有对齐的要求就出现了内存填充(空着若干个字节,不使用) 。

A

i c j d 结构总大小 结构体对齐要求

0 4 8 12 16 4

B

i c d j 结构总大小 结构体对齐要求

0 4 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值