C中指针的一些复杂声明(C Primer Plus)

复杂的指针声明示例:

声明注释
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 表明了这四个元素都是指向 int 的指针。因此这条声明要表达的是: oof 是一个内含3个元素的数组,其中每个元素是由4个指向 int 的指针组成的数组。简而言之,oof 是一个3*4的二维数组,每个元素都是指向 int 的指针。编译器要为12个指针预留存储空间。

   下面来看下一个声明: int (* uuf) [3] [4] ;
   圆括号使得 * 先与 uuf 结合,说明 uuf 是一个指针,所以 uuf 是一个指向 3*4 的 int 类型二维数组的指针。编译器要为一个指针预留存储空间。

   根据这些规则还可以声明:

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

这3个函数都接受 int 类型的参数。

typedef 建立一系列相关类型:

  1. typedef int arr5[5] ;
  2. typedef arr5 * p_arr5 ;
  3. typedef p_arr5 arrp10[10] ;
声明注释
arr5 togs ;togs一个内含5个 int 类型的数组
p_arr5 p2 ;p2一个指向数组的指针,该数组内含5个 int 类型的值
arrp10 ap ;ap一个内含10个指针的数组,每个指针都指向一个内含5个 int 类型值的数组
以上内容摘录于C Primer Pluss(第六版) p480
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值