C语言学习第11篇---union enum, sizeof, typedef 分析

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

union相关总结

定义联合体

uniontest

{
    intoffice;
    charteacher[5];
};

uniontestb;

从这可以看出来,联合体内存是共享的,也就是只看那部分占用内存最大则联合体占用就是该内存

相应的缺点就是操作office就会改变teacher的前四个字节的值

 

根据这个特性,可以有一个妙用!

uniontest
{
     unsignedcharODR;
    struct
    {
          unsignedcharbit0:1,

                        bit1:1,

                        bit2:1,

                        bit3:1,

                        bit4:1,

                        bit5:1,

                        bit6:1,

                        bit7:1;
    };

};

uniontestc;

这里联合体有两个成员,一个char ODR,还有一个8位的结构体,因为内存共享,这么着操作后边的结构体就可以改变ODR

例如c.ODR = 0XFF,或者c.bit0 = 1:

这就可以对ODR进行每一位进行赋值了


第二个作用就是节约内存,在内存比较小的单片机内经常使用

在STM8里定义

uint8_t flag1=0;

uint8_t flag2=0;

uint8_t flag3=0;

…………

这么每一个flag会占用一个字节的ram空间

要是使用union会节约空间

union uflag
{
     unsignedcharflag;

    struct
    {
          unsignedcharflag0:1,

                        flag1:1,

                        flag2:1,

                        flag3:1,

                        flag4:1,

                        flag5:1,

                        flag6:1,

                        flag7:1;

    };

};

union uflag flg;

 

这么每个flag占用1bit,8个才占一个字节


union的三种说明方式,基本与结构体一样

1、

uniontest

{

   intnum;

   charstudent[4];

};

union testa,b;    //



2、

uniontest

{

   intnum;

   charstudent[4];

}a,b;                //



3、

union

{

   intnum;

   charstudent[4];

}a,b;               //

 

enum : 枚举

是C语言中的一种自定义类型

值是可以根据需要自己定义的整型值

第一个定义的enum值默认是0

默认情况下的enum值是在前一个定义值得基础上加1

enum类型的变量只能取定义时的离散值

 

enum中定义的值是C语言中真正意义上的常量

在工程中enum多用于定义整型常量

 

实验一:enum的使用

#include <stdio.h>
enum
{
    ARRAY_SIZE = 10
};
enum Color
{
    RED    = 0x00FF0000,
    GREEN  = 0x0000FF00,
    BLUE   = 0x000000FF
};
void PrintColor(enum Color c)
{
    switch( c )
    {
        case RED:
            printf("Color: RED (0x%08X)\n", c);
            break;
        case GREEN:
            printf("Color: GREEN (0x%08X)\n", c);
            break;
        case BLUE:
            printf("Color: BLUE(0x%08X)\n", c);
            break;
    }
}
void InitArray(int array[])
{
    int i = 0;
   
    for(i=0; i<ARRAY_SIZE; i++)
    {
        array[i] = i + 1;
    }
}
void PrintArray(int array[])
{
    int i = 0;
   
    for(i=0; i<ARRAY_SIZE; i++)
    {
        printf("%d\n", array[i]);
    }
}
int main()
{
    enum Color c = GREEN;
   
    int array[ARRAY_SIZE] = {0};
   
    PrintColor(c);
   
    InitArray(array);
   
    PrintArray(array);
   
    return 0;
}

 

sizeof :

sizeof是编译器的内置指示符

sizeof用于计算类型或变量所占的内存大小

sizeof的值在编译器就已经确定

 

用于类型:  sizeof(type)

用于变量: sizeof(var)或sizeof var

 

注意:

sizeof 是C语言的内置关键字而不是函数

- 在编译过程中所有的sizeof将被具有的数值所替换

- 程序的执行过程与sizeof没有任何关系

 

实验2:sizeof的本质

#include <stdio.h>
int f()
{
    printf("Delphi Tang\n");
   
    return 0;
}
int main()
{
    int var = 0;
   
    int size = sizeof(var++);
   
    printf("var = %d, size = %d\n", var, size);
   
    size = sizeof(f());
   
    printf("size = %d\n", size);
   
    return 0;
}

 

typedef:面试的时候可能被问到哦

用于给一个已经存在的数据类型重命名

本质上不能产生新的类型

重命名的类型:

- 可以在type语句之后定义

- 不能被unsigned 和 signed 修饰

       typedef type new_name

 

实验3:typedef使用实例

#include <stdio.h>
typedef int Int32;
struct _tag_point
{
    int x;
    int y;
};
typedef struct _tag_point Point;
typedef struct
{
    int length;
    int array[];
} SoftArray;
typedef struct _tag_list_node ListNode;
struct _tag_list_node
{
    ListNode* next;
};
int main()
{
    Int32 i = -100;        // int
    //unsigned Int32 ii = 0;
    Point p;               // struct _tag_point
    SoftArray* sa = NULL;  
    ListNode* node = NULL; // struct _tag_list_node*
   
    return 0;
}

 

小结:

enum用于定义离散值类型

enum定义的值是真正意义上的常量

sizeof是编译器的内置指示符

sizeof不参与程序的执行过程

typedef用于给类型重命名

 - 重命名的类型可以在typedef语句之后定义

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页