复杂声明的正确解读(*、()、[])
作者:互联网
摘自《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类型元素的数组
要看懂以上声明,关键要理解*、()和[]的优先级。记住下面几条规则。
- 数组名后面的[]和函数名后面的()具有相同的优先级。它们比*(解引用运算符)的优先级高。因此下面声明的risk是一个指针数组,不是指向数组的指针:int *risks[10];
- []和()的优先级相同,由于都是从左往右结合,所以下面的声明中,在应用方括号之前,*先与rusks结合。因此rusks是一个指向数组的指针,该数组内含10个int类型的元素:int (* rusks)[10];
- []和()都是从左往右结合。因此下面声明的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