读书笔记《c语言深度解剖》(4)

10.struct关键字
这里struct关键字讲解得比较少,主要有3点:
(1)空结构体的大小为1(在gcc下我的输出是0).struct type { }; sizeof(type) = 1; (2)柔性数组:在c99中,允许结构最后一个元素是一个大小未确定的数组,这个数组叫做柔性数组。但是柔性数组前面必须至少有一个其他成员。用sizeof返回结构体大小的时候,并不包含柔性数组大小。但是在为含有柔性数组的结构体分配内存时,应该用malloc()函数进行动态分配,并且分配的内存大小应大于结构体的大小,以适应柔性数组的预期大小。typedef struct _MYTYPE { int a; int b[]; }mytype; sizeof(mytype) = 4; //在分配内存空间的时候,应该是 mytype *p = (mytype*)malloc(sizeof(mytype) + 10*sizeof(int)); 然后,我们可以用p->b[index]访问柔性数组,然而,此时sizeof(mytype)的值仍然为4.也就是说,柔性数组只能算个编外人员。(注意,c89不支持柔性数组)
(3)struct和class的区别:struct默认访问权限为public,而class为private。
11.union关键字
union关键字用足够大的空间来维护众多成员中的一个,所有的成员具有相同的起始地址。例如:union A { int a; char b; double c; }; 在这个union中,最大长度的是double,所以A的大小就是double所需空间的大小。union的默认访问权限为public,主要用来压缩空间。
一个常见的例子是,用union来判断当前系统采用的是大端还是小端存储模式。代码为:int checkSystem() { //如果系统是小端模式,则返回1,大端模式返回0 union U { int i; char ch; }a; a.i = 1; return (a.ch == 1) } 大端模式int i = 1:低 0x00 0x00 0x00 0x01 高
小端模式int i = 1:低 0x01 0x00 0x00 0x00 高
12.enum关键字
enum的定义一般如下:enum enum_Type { item_1, item_2, item_3 = 10, item_4 }e; 其中enum_Type是自定义的一种数据类型名,e是该类型的一个变量。e只能取花括号内的任何一个值。如果不赋值,花括号内的值从0开始一直加1.上面的例子中,item_1 = 0, item_2 = 1, item_3 = 10, item_4 = 11。那么enum和#define宏的区别是什么呢?
(1)#define宏是在预编译的时候进行简单的替换,enum是在编译的时候确定其值
(2)一般在编译器里,可以调试enum常量,不能调试#define宏常量。
(3)enum可以一次性定义大量的相关常量,#define宏一次只能定义一个。#include <stdio.h> int main() { enum enumType { item1, item2, item3 = 10, item4 }e; printf("%d/n", e); //输出一个随机整数 printf("%d/n", sizeof(e)); //输出4 return 0; } 上面这个例子说明,enum类型的变量是被当做int型来处理的。

你可能感兴趣的:(c,struct,读书,Class,语言,编译器)