C 中的复杂声明

引用

C Primer Plus


C 中的复杂声明

C 允许用户自定义数据形式。虽然我们常用的是一些简单的形式,但是根据需要有时还会用到一些复杂的形式。在一些复杂的声明中,常含下面的符号。如下所示:

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

下面的一些复杂的声明示例 :

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

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

1.数组名后面的 [] 和 函数名后面的 () 具有相同的优先级。它们比 * 的优先级高。因此下面声明的 risk 是一个指针数组,不是指向数组的指针。

int * risks[10];  // 声明一个内含 10 个元素的数组,每一个元素都是一个指向 int 的指针。(指针数组)

2.[] 和 () 的优先级相同,由于都是从左向右结合,所以下面的声明中,在应用方括号之前, * 先与 rusks 结合。因此 rusks 是一个指向数组的指针,该数组内含 10 个 int 类型的元素。

int (* rusks)[10];   // int 类型数组的指针。

3.[]和() 都是从左向右结合。因此下面声明的 goods 是一个由 12 个内含 50 int 类型值的数组组成的二维数组,不是一个有 50 个 内含 12 个 int 类型值的数组组成的二维数组。

int goods[12][50];

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

int * oof[3][4];

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

int (* uuf)[3][4];

() 使得 * 先于 uuf 结合,说明 uuf 是一个指针,所以 uuf 是一个指向 3 x 4 的 int 类型二维数组的指针。编译器为一个指针预留存储空间。

根据这些规则,还可以说明 :

char * fump(int);          // 返回字符指针的函数
char (* frump)(int);       // 指向函数的指针,该函数的返回类型为 char 
char (* flump[3][3])(int); //  内含 3 个指针的数组,每个指针都指向返回类型为 char 的函数。

这三个函数都接受 int 类型的参数。
可以使用 typedef 建立一系列相关类型 :

typedef int arr5[5]
typedef arr5 * p_arr[5]
typedef P_arr5 arrp10[10]

arr5 togs; // togs 是一个内含 5 个 int 类型值的数组
p_arr5 p2; // p2 是一个指向数组的指针,该数组内含 5 个 int 类型的值。
arrp10 ap; // ap 是一个内含 10 个指针的数组,每个指针都指向一个内含 5 个int 类型值的数组。


小结

看了眼 C 语言,又回头看了眼 Java , 突然间觉得还是 Java 眉清目秀呀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值