C----知识补全

------------------------------------------------------------------------------------------

联合体

联合的另一种用法是, 在结构中储存与其成员有从属关系的信息。 例如, 假设用一个结构表示一辆汽车。 如果汽车属于驾驶者, 就要用一个结构成员来描述这个所有者。 如果汽车被租赁, 那么需要一个成员来描述其租赁公司。 可以用下面的代码来完成:

struct owner {
	char socsecurity[12];
	...
};

struct leasecompany {
	char name[40];
	char headquarters[40];
	...
};
	
union data {
	struct owner owncar;
	struct leasecompany leasecar;
};

struct car_data {
	char make[15];
	int status; /* 私有为0, 租赁为1 */
	union data ownerinfo;
	...
};

假设flitscar_data类型的结构变量, 如果flits.status为0, 程序将使用flits.ownerinfo.owncar.socsecurity, 如果flits.status为1, 程序则使用flits.ownerinfo.leasecar.name


复杂声明

复杂的声明示例:

int board[8][8]; // 声明一个内含int数组的数组
int ** ptr; // 声明一个指向指针的指针, 被指向的指针指向int
int * risks[10]; // 声明一个内含10个元素的数组, 每个元素都是一个指向int的指针
int (* rusks)[10]; // 声明一个指向数组的指针, 该数组内含10个int类型的值
int * oof[3][4]; // 声明一个3×4 的二维数组, 每个元素都是指向int的指针
int (* uuf)[3][4]; // 声明一个指向3×4二维数组的指针, 该数组中内含int类型值
int (* uof[3])[4]; // 声明一个内含3个指针元素的数组, 其中每个指针都指向一个内含4个int类型元素的数组

要看懂以上声明, 关键要理解*、 ()和[]的优先级。 记住下面几条规则。

  1. 数组名后面的[]和函数名后面的()具有相同的优先级。 它们比*(解引用运算符) 的优先级高。 因此下面声明的risk是一个指针数组, 不是指向数组的指针:int * risks[10];
  2. []和()的优先级相同, 由于都是从左往右结合, 所以下面的声明中,在应用方括号之前, *先与rusks结合。 因此rusks是一个指向数组的指针, 该数组内含10个int类型的元素:int (* rusks)[10];
  3. []和()都是从左往右结合。 因此下面声明的goods是一个由12个内含50个int类型值的数组组成的二维数组, 不是一个有50个内含12个int类型值的数组组成的二维数组:int goods[12][50];

把以上规则应用于下面的声明:

int * oof[3][4];

[3]*的优先级高, 由于从左往右结合, 所以[3]先与oof结合。 因此,oof首先是一个内含3个元素的数组。 然后再与[4]结合, 所以oof的每个元素都是内含4个元素的数组。 *说明这些元素都是指针。 最后, int表明了这4个元素都是指向int的指针。 因此, 这条声明要表达的是: foo是一个内含3个元素的数组, 其中每个元素是由4个指向int的指针组成的数组。 简而言之, oof是一个3×4的二维数组, 每个元素都是指向int的指针。 编译器要为12个指针预留存储空间。


预处理

未完


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值