c语言的结构体、共用体、枚举
2016-11-23 20:35
211 查看
1.结构体
现在有一个结构体var,以他为例进行分析struct s { char a; int b; }var;
var是struct s类型的变量,其值为0。结构体名和数组名不同,它代表的是整个结构体变量,而不是一个地址,所以它的值是没有意义的
&var是struct s *类型的变量,其值为结构体第一个元素的地址(&(var.a))。它代表的是整个结构体的起始地址
结构体元素按照一定规律对齐,要保证提取数据的高效,同时保证节省体积。对于32位linux来说,规律为:各个类型存储时的起始地址,需是特定字节数整数倍;此外,还需保证结构体本身的开头和结尾地址都是4字节对齐的
以下是结构体元素对齐实例
struct s { char a; //存放起始地址是1字节的整数倍 short b; //存放起始地址是2字节的整数倍 int c; //存放起始地址是4字节的整数倍 }var1; //结构体本身的开头和结尾地址都是4字节的整数倍
struct s { char a; //存放起始地址是1字节的整数倍 int c; //存放起始地址是4字节的整数倍 short b; //存放起始地址是2字节的整数倍 }var2; //结构体本身的开头和结尾地址都是4字节的整数倍
struct s { char a; //存放起始地址是1字节的整数倍 struct var2;//存放起始地址是4字节的整数倍 short b; //存放起始地址是2字节的整数倍 }var3; //结构体本身的开头和结尾地址都是4字节的整数倍
由此可见,元素的安放顺序非常讲究
offsetof宏:用来计算某元素相对于结构体首地址的偏移量。原型为
offsetof(type, member) //type是结构体类型,member是具体的元素名
container_of宏:用来计算包含了某元素的结构体的地址。这个宏是基于offsetof宏实现的,其原型为
container_of(ptr, type, member) //ptr是某元素的地址,type是含了该元素的结构体类型,member是该元素的名字
2.共用体
共用体用起来和结构体很相似,现在有一个共用体var,以他为例进行分析union s { char a; int b; }var; var.a = 23; //赋值方法和结构体一模一样
sizeof对共用体变量测得的大小,是共用体中占用内存最大的那个变量的大小
3.枚举
枚举也是c语言的一种数据类型,和结构体、共用体是一伙的,用法如下enum return_value { ERROR; RIGHT; }; //定义一个共用体类型return_value enum return_value ret; //定义一个return_value类型的变量ret ret = ERROR; //把ERROR赋值给ret
枚举类型的变量其实就是规定了一个变量,它能有几种值,并且这些值都由符号代替。ERROR、RIGHT这些符号的本质,其实就是int类型的值罢了,之所以用符号代替,只是为了让人理解起来方便一些
相关文章推荐
- C语言03_构造类型 数组, 结构体, 共用体, 枚举类型介绍
- C语言基础(六)- 结构体、共用体、枚举和typeof自定义类型
- C语言回顾(八、结构体,联合/共用体,枚举)——iOS开发基础
- C语言构造数据类型之结构体、共用体、枚举
- C语言学习笔记-结构体、共用体、枚举
- 由C语言位域(冒号)谈C语言的结构体、枚举、共用体
- [C语言]菜鸟的一些理解-结构体,共用体,枚举,位域
- [C语言]菜鸟的一些理解-结构体,共用体,枚举,位域
- C语言之结构体、共用体、枚举
- C语言之结构体 共用体 枚举 typedef
- C语言:结构体和联合体(共用体)
- C语言 结构体与共用体
- 瘋子C语言笔记(结构体/共用体/枚举篇)
- C语言结构体,联合体,枚举与typedef
- 结构体与共用体05 - 零基础入门学习C语言57
- 结构体与共用体06 - 零基础入门学习C语言58
- 结构体、共用体和枚举之选夫婿1
- 黑马程序员-------C语言回顾-结构体、枚举和文件
- 结构体、共用体、枚举
- C语言中结构体与共用体(二)