struct、union、enum

1、struct

①取地址

数组:数组名会被转化为指针

int a[3];

int *pa = a;

函数:函数名会被转化为指针

#include <stdio.h>

void max(void){
    printf("hello, world!
");
}

int main()
{
    void (*pfun)();
    pfun = &max;     //&可加可不加
    
    pfun();               //第一种调用方式
    (*pfun)();            //第二种调用方式
}

结构体

结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,传参时传结构体时间和空间消耗会比较大,最好传结构体指针。

结构体可整体赋值。

struct typename a, b;

b = a;

②位域

C语言位域(位段)详解 (biancheng.net)

2、enum

enum和宏定义类似,是在预处理阶段将名字替换成对应的值。

枚举的成员是常量,不可赋值。

枚举类型存放的是整数,一个枚举变量占的内存空间和一个枚举成员占的一样大,因此比宏定义节省内存,占内存的长度可能和int一样大。

enum week{Mon=1, Tue, Wed, Thu, Fri, Sat, Sun} day = Mon;

printf("sizeof(week) = %d, sizeof(day) = %d
", 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
", 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
", person[i].name, person[i].age, person[i].height);
    }
    printf("
");    
}

结果:

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成员占的内存大小。

原文地址:https://www.cnblogs.com/keepdoing123/p/14774226.html