c语言中结构体中默认值,c++ 结构体 默认值_漫谈——typedef关键字、结构体、枚举及共同体...

(1)typedef关键字和结构体

typedef用来定义新的数据类型,通常typedef与结构体或枚举的定义配合使用。使用typedef的目的使结构体的表达更加简练。个人认为typedef不是必须使用的,但是精炼了代码。

a)typedef定义数据类型

typedef int integer;

integer a,b;

b)定义一个结构体GPIO_InitTypeDef:

struct GPIO_InitTypeDef

{

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

};

给结构体起一个别名为 GPIO_Initstruct

typedef struct GPIO_InitTypeDef GPIO_Initstruct

利用typedef关键字可以直接写成:

typedef struct

{

uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

}GPIO_InitTypeDef;

故GPIO_InitTypeDef为结构体,可接将typedef struct GPIO_InitTypeDef GPIO_Initstruct该写为GPIO_InitTypeDef GPIO_Initstruct。

struct stu

{

char a;

int b;

}name[3],*p,people//name[3]为结构体数组,*p为结构体指针,name为结构体变量

引用时:name[0].a或name[2].b或p->b或people.a

(2)#define和typedef的区别

typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,它并不实际分配内存空间。

typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。

#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),即宏定义,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。

例如:

#define PI 3.1415926

程序中的:area=PI*r*r 会替换为3.1415926*r*r

如果你把#define语句中的数字9 写成字母g 预处理也照样带入。

typedef int* int_ptr 表面上功能上等同 #define int_ptr int*,但

#define int_ptr int *

int_ptr a, b; //相当于int * a, b; 只是简单的宏替换,同时define不是句子,不加分号。

typedef int* int_ptr;

int_ptr a, b; //a, b 都为指向int的指针,typedef为int* 引入了一个新的助记符

(3)枚举型enmu

枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为

typedef enum

{ Bit_RESET = 0,

Bit_SET

}BitAction;//BitAction为枚举型

enum [DAY]

{

MON=1, TUE, WED, THU, FRI, SAT, SUN

};

enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY

enum DAY happy, angry; //变量happy和angry的类型均为枚举型enum DAY

或:

enum

{

saturday,

sunday = 0,

monday,

tuesday,

wednesday,

thursday,

friday

} workday; //变量workday的类型为枚举型enum DAY

或用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:

typedef enum workday

{

saturday,

sunday = 0,

monday,

tuesday,

wednesday,

thursday,

friday

} work; //此处的work为枚举型enum workday的别名

a) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,不能在程序中用赋值语句赋值;元素之间用逗号“,”隔开。

b) DAY是一个标识符,即集合的名字,是一个可选项,即是可有可无的项。

c) 第一个枚举成员的默认值为整型的0,下面枚举成员的值依次+1。

d) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

e) 枚举型是预处理指令#define的替代。

f) 类型定义以分号“;”结束。

(4)共同体union

不同类型的变量存放到同一段内存单元中,即覆盖技术,使几个变量互相覆盖。这几个不同的变量共同占用一段内存结构,即共用体。

union data

{

成员列表

}变量表列;

如:

union data

{

int i;

char ch;

float f;

}a,b,c; //和结构体,枚举的表示一致;

若有以下赋值:

a.i=1;

a.ch=9;

a.f=10.3;

注意,完成上诉的赋值,只有a.f=10.3是有效的,a.i和a.ch是无效的。

共同体地址和它的各成员地址都是同一地址。

a)共同体在任意时刻只存在一个成员。

b)共同体变量分配内存长度为最长成员所占字节数。

c)共同体和结构体可以互相嵌套。

d)共同体虽然省内存,但是数据容易覆盖,一旦出现覆盖,程序就会出现错误。

『文末说明』

本文作者:小强子

知乎ID:Power小强

一个细腻不油腻,嗜好多能力小的普通人,专注于分享电子电气相关知识的打杂硕士生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值