struct、union、enum
1、struct
①取地址
数组:数组名会被转化为指针
int a[3];
int *pa = a;
函数:函数名会被转化为指针
#include <stdio.h> void max(void){ printf("hello, world!\n"); } int main() { void (*pfun)(); pfun = &max; //&可加可不加 pfun(); //第一种调用方式 (*pfun)(); //第二种调用方式 }
结构体
结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,传参时传结构体时间和空间消耗会比较大,最好传结构体指针。
结构体可整体赋值。
struct typename a, b;
b = a;
②位域
2、enum
enum和宏定义类似,是在预处理阶段将名字替换成对应的值。
枚举的成员是常量,不可赋值。
枚举类型存放的是整数,一个枚举变量占的内存空间和一个枚举成员占的一样大,因此比宏定义节省内存,占内存的长度可能和int一样大。
enum week{Mon=1, Tue, Wed, Thu, Fri, Sat, Sun} day = Mon; printf("sizeof(week) = %d, sizeof(day) = %d\n", sizeof(week), sizeof(day));
结果:
sizeof(week) = 4, sizeof(day) = 4
3、union
struct 和 union 的区别是:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
#include <stdio.h> union data{ char name; int age; short height; }; union data person[3]; void printf_mess(void); int main(void) { printf("sizeof(person)=%d, sizeof(person[1])=%d, sizeof(data)=%d\n", sizeof(person), sizeof(person[1]), sizeof(data)); person[1].name = 30; printf_mess(); person[0].age = 0x11223344; person[1].age = 0x12345678; printf_mess(); person[1].height = 0x6891; printf_mess(); } void printf_mess(void) { for (char i=0; i<3; i++){ printf("0x%x, 0x%x, 0x%x\n", person[i].name, person[i].age, person[i].height); } printf("\n"); }
结果:
sizeof(person)=12, sizeof(person[1])=4, sizeof(data)=4
0x0, 0x0, 0x0
0x1e, 0x1e, 0x1e
0x0, 0x0, 0x0
0x44, 0x11223344, 0x3344
0x78, 0x12345678, 0x5678
0x0, 0x0, 0x0
0x44, 0x11223344, 0x3344
0xffffff91, 0x12346891, 0x6891
0x0, 0x0, 0x0
各个成员在内存中的分布:
由结果看到,union的数组每个元素占独立内存,每个元素占的内存大小为最长的union成员占的内存大小。