结构体
1,结构体即为多个基本数据类型组合而成的数据类型。结构体本质上同int等一样同为数据类型,可以定义变量,内部成员不能直接赋值。
struct Man { int age = 30; int score = 80; };
上面是错误的。正确写法如下:
struct Man { int age; //这样就好了 int score; }; int main() { struct Man man1 = {30,80}; }
2,结构体常同typedef类型重命名一同使用,如下:
typedef struct Man { int age; //这样就好了 int score; }MAN; int main() { MAN man1 = {30,80}; }
3,结构体内存对齐
typedef struct Man { char age; //这样就好了 int score; }MAN; int main() { printf("%d",sizeof(MAN)); }
以上代码输出的值为8,而不是直观意义上的5,这是因为结构体中的成员是对齐的,这里按4字节对齐。当CPU访问正确对齐的数据时,它的运行效率最高,数据对齐不是内存结构的一部分,而是CPU结构的一部分。
结构体成员对齐是按照类型大小对齐的,而结构体按照长度最大的类型对齐。如成员中char按1字节对齐,short按2字节对齐,int按照4字节对齐等,这里的结构体成员最长的是int为4字节,所以这个结构体按照4字节对齐。
联合体
1,联合体本质上为不同数据类型共享存储空间,此空间要大到足够容纳最"宽"的成员。它的所有成员相对于基地址的偏移量都为0。
union U { char s[9]; int n; double d; };
2,联合体通常与结构体共用,通过不同方式给变量赋值。
union REG { struct { unsigned short a; unsigned short b; } H;
unsigned int R;
} Reg;
上面可以通过Reg.R给变量赋值,也可以分别通过Reg.H.a、Reg.H.b分别赋值,要注意字节序。