本文共 1724 字,大约阅读时间需要 5 分钟。
1.普通结构体
struct tag{ member-list;}variable-list;
2.匿名结构体
struct { int a; char b; float c;}x;
struct Node{ int data; struct Node * next;}
1.普通结构体定义和初始化
struct Point{ int x; int y;}p1;//p1为结构体类型的变量struct Point p2; //定义结构体变量p2struct Point p3 = { 2,3};//初始化结构体变量
2.嵌套结构体定义和初始化
struct Node{ int data; struct Point p; struct Node * next;}n1 = { 10,{ 4,5},NULL};
1.为什么要内存对齐
如果不内存对齐,因为硬件平台的限制,进而访存次数增加,进而降低效率 2.什么是内存对齐 通过牺牲空间的方法来换取效率的提升叫做内存对齐 3.内存对齐的原则 (1)第一个元素不需要对齐,直接存放 (2)其他成员变量要对齐(指的是起始偏移量能够整除对齐数)到某个数字(对齐数)的整数倍的地址数 (3)结构体的总大小为最大对齐数的整数倍 (4)如果嵌套了结构体的情况,嵌套的结构体要对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍1.#pragma pack(2),修改默认对齐字节数为2,对齐数取2与结构体变量对齐数的较小值
2.#pragma pack(),取消设置的默认对齐数,还原为默认1.位段的成员可以是int,unsigned int或signed int
2.位段的成员名后边有一个冒号和一个数字struct A{ int _a:2; int _b:5; int _c:10; int _d:30;};//printf("%d\n",sizeof(struct A)); 2
#include#define MAX_SIZE A+Bstruct _Record_Struct{ unsigned char Env_Alarm_ID : 4; unsigned char Para1 : 2; unsigned char state; unsigned char avail : 1; }*Env_Alarm_Record;int main(){ printf("%d\n",(sizeof(struct _Record_Struct) )); //3 return 0;}
运行结果:
31.{ }中存放的是枚举常量
2.默认从0开始,依次增11.增加代码的可读性和可维护性
2.和#define定义的标识符比较,枚举有类型检查,更加严谨 3.防止了命名污染 4.便于调试 5.使用方便,可以一次定义多个变量1.联合的成员是共同用同一块内存空间
2.联合体的大小至少是最大成员的大小 3.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍示例
#includeunion Un{ int i; char c;};union Un un;int main(){ printf("%p\n", &(un.c)); printf("%p\n", &(un.i)); return 0;}
运行结果:
00C1A13C 00C1A13C#includeint main(){ union Un { int i; char c; }; union Un un; un.i = 1; printf("%d\n", un.c); return 0;}
运行结果:
1转载地址:http://dezpz.baihongyu.com/