C语言深度学习

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

2019-06-07  本文已影响0人  CodeAllen
0414.jpg

说明:
本文原创作者『Allen5G』
首发于微信公众号『Allen5G』
标签:嵌入式软件,算法,架构


union相关总结

定义联合体

uniontest

{
    intoffice;
    charteacher[5];
};

uniontestb;
image.gif

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

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

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

uniontest
{
     unsignedcharODR;
    struct
    {
          unsignedcharbit0:1,

                        bit1:1,

                        bit2:1,

                        bit3:1,

                        bit4:1,

                        bit5:1,

                        bit6:1,

                        bit7:1;
    };

};

uniontestc;
image.gif

这里联合体有两个成员,一个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;
image.gif

这么每个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;               //
image.gif

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;
}
image.gif

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;
}
image.gif

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;
}
image.gif

小结:

enum用于定义离散值类型

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

sizeof是编译器的内置指示符

sizeof不参与程序的执行过程

typedef用于给类型重命名

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

上一篇 下一篇

猜你喜欢

热点阅读