其他分享
首页 > 其他分享> > 复杂声明的正确解读(*、()、[])

复杂声明的正确解读(*、()、[])

作者:互联网

摘自《C Primer Plus第六版中文版》page484

 

声明时可使用的符号
符号 含义
* 表示一个指针
() 表示一个函数
[] 表示一个数组

 

 

 

 

 

 

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

int board[8][8];  //声明一个内含int数组的数组

int **ptr;    //声明一个指向指针的指针,被指向的指针指向int

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

int (* risks)[10];   //声明一个指向数组的指针,该数组内含10个int类型的值

int * oof[3][4];   //声明一个3x4的二维数组,每个元素都是指向int的指针

int (* uuf)[3][4];   //声明一个指向3x4二维数组的指针,该数组中内含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];

 

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

char * fump(int);  //返回字符指针的函数

char (* frump)(int);  //指向函数的指针,该函数的返回类型为char

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

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

 

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

typedef int arr5[5];

typrdef arr5 * p_arr5;

typedef p_arr5 arrp10[10];

arr5 togs;  //togs是一个内含5个int类型值的数组;

p_arr5 p2;  //p2是一个指向数组的指针,该数组内含5个int类型的值

arrp10 ap;  //ap是一个内含十个指针的数组,每个指针都指向一个内含5个int类型值的数组

标签:正确,内含,int,解读,指向,数组,声明,指针
来源: https://www.cnblogs.com/taouu/p/14616543.html