首先摆一个问题: C/C++代码里的两行
int ( * uof [3] ) [4];
int ( * flump [3] ) ( );
到底定义了个什么东东???
if你很清楚,那么你可以return 了,else 就跟着我一起看下去吧!
在使用C/C++编程的时候,经常会遇到指针和数组,本来也没什么,可有时候两者偏偏就搞到一块,组合成指针数组或者数组指针之类的,这就有点让人头大,分不清啊!
就算今天分清楚了,下次再遇到的时候又忘了。今天在这里专门总结下,以备不时之需。
首先要说明的是,C/C++ 允许我们在进行变量或函数声明的时候添加一个或者多个修饰符来修饰标识符。
声明时可以使用的修饰符
修饰符 | 含义 |
* | 表示一个指针 |
( ) | 表示一个函数 |
[ ] | 表示一个数组 |
C/C++允许同时使用多于1个修饰符,这就使得可以创建如下各种各样的类型:
int board [8] [9]; // int 数组的数组
int ** ptr; // 指向 int 的指针的指针
int * risks [10]; // 具有10个元素的数组,每个元素都是一个指向 int 的指针
int ( * risks ) [10]; // 一个指针,指向具有10个元素的int 数组
int * oof [3] [4]; // 一个3*4的数组,每个元素都是一个指向 int 的指针
int ( * uuf ) [3] [4]; // 一个指针,指向 3*4的int 数组
弄清楚这些声明的诀窍在于理解使用修饰符的顺序。下面这些规则会让你对其有所了解:
1. 表示一个数组的 [ ] 和表示一个函数的 ( ) 具有同样的优先级,这个优先级高于间接运算符 * 的优先级。这意味着下面的声明使得 risks 是一个指针数组,而不是一个指向数组的指针。
int * risks [10];
2. [ ] 和 ( ) 都是从左到右进行结合的。下面的声明使 goods 是一个由12个具有50个int 值的数组构成的数组,而不是一个由50个具有12个int值的数组构成的数组:
int goods[12][50];
3. [ ] 和 ( ) 具有相同的优先级,但由于他们是从左到右结合的,所以下面的声明在应用方括号之前先将 * 和 risks 组合在一起。这意味着risks 是一个指向具有10个int 值的数组的指针:
int ( * risks ) [10];
现在看下 int ( * uof [3] ) [4]; 知道含义了吧:一个具有3个元素的数组,每个元素是一个指向具有4个元素的int 数组的指针。
这些规则同样产生下面的类型:
char * fump ( ); // 返回指向char 的指针的函数
char ( * frump ) ( ); // 指向返回类型为 char 的函数的指针
char ( * flump[ 3 ] ) ( ); //返回类型 为由3个指针组成的数组,每个指针指向为char 的函数
到此估计大家都清除了吧,不过个人建议 像可读性如此之差的代码尽量不要写,自己爽了,维护的人可头大了。。