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

网友投稿 939 2022-05-30

知识来源主要是陈正冲老师的《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

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[i] = i + 1;

}

}

void PrintArray(int array[])

{

int i = 0;

for(i=0; 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

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

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;

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

};

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语句之后定义

C 语言

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:交换机的堆叠技术
下一篇:Verilog初级教程(18)Verilog中的函数与任务
相关文章