zoukankan      html  css  js  c++  java
  • 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成员占的内存大小。

  • 相关阅读:
    用FOR XML PATH('') 实现一列多行拼接为一行
    RTC相关文章收集
    XML-RPC vs. RTC Format
    获取当前月份的第一天
    image读取流
    WAMP解决访问后显示"You don't have permission to access / on this server."
    cxGrid之checkbox小结
    CXGRID用法(取行、列值;定位选中某行等等)
    delphi显示Sqlite的Text字段
    使用TRoleAuth类对DataSnap服务端的接口授权
  • 原文地址:https://www.cnblogs.com/keepdoing123/p/14774226.html
Copyright © 2011-2022 走看看