14.13 奇特的声明

C允许您创建精心定制的数据形式。虽然我们坚持使用较简单的形式,但是我们觉得应该指出这些可能性。当进行一个声明时,可以添加一个修饰符来修饰名称(或标识符)。

表14.1 声明时可以使用的修饰符

 

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

 

修饰符 含义
* 表示一个指针
() 表示一个函数
[] 表示一个数组

C允许同时使用多于1个的修饰符,这就使得可以创建如下各种各样的类型:

阅读 ‧ 电子书库

弄清楚这些声明的诀窍便于理解使用修饰符的顺序。下面这些规则会让您对其有所了解:

1.表示一个数组的[]和表示一个函数的()具有同样的优先级,这个优先级高于间接运算符*的优先级。这意味着下面的声明使得risks是一个指针数组,而不是一个指向数组的指针:

阅读 ‧ 电子书库

2.[]和()都是从左到右进行结合的。下面的声明使goods是一个由12个具有50个int值的数组构成的数组,而不是一个由50个具有12个int值的数组构成的数组:

阅读 ‧ 电子书库

3.[]和()具有相同的优先级,但由于它们是从左到右结合的,所以下面的声明在应用方括号之前先将*和rusks组合在一起。这意味着rusks是一个指向具有10个int值的数组的指针:

阅读 ‧ 电子书库

我们把这些规则应用于下面这个声明:

阅读 ‧ 电子书库

[3]具有比*更高的优先级,并且根据从左到右的规则,它的优先级比[4]高。因此,oof是一个具有3个元素的数组。下面是[4],所以oof的元素是具有4个元素的数组。*说明这些元素都是指针。int完成了该描述:oof是一个3元素数组,每个元素是由4个指向int的指针组成的数组。或者简单地说,它是一个3×4的指向int的指针数组。需要为12个指针留出存储空间。

现在来看看这个声明:

阅读 ‧ 电子书库

圆括号使修饰符*具有最高优先级,所以uuf就是一个指向3×4的int数组的指针。需要为一个单个指针留出存储空间。

这些规则同样也产生下面的类型:

阅读 ‧ 电子书库

可以使用typedef建立一系列相关的类型:

阅读 ‧ 电子书库

当把结构也带入这样的描述中,声明的可能性真的会变得很复杂。至于应用,我们就不再讨论了。