分类: C/C++
2009-03-17 12:38:45
C语言变量定义或声明中,如果比较复杂,让识别并读出其类型成为了一个困难的任务。例如:int *a[3], 到底是指针的数组,还是数组的指针。
使用下面的四个原则。
1. 由外及内:如果存在多级的括号,把最外层的括号看成整体,读完括号外面,再读括号里面。
2. 先前再后:对每一层,变量名或包含变量名的括号位于中间,类型符号放在前面和后面,先读前面的部分,再读后面的部分。
3. 从左向右:对每一部分,从左到右阅读出每个类型符号。
4. 忽略次要:在阅读时,为了便于理解,可以先忽略掉次要的信息:如数组的大小,函数的参数和返回值类型。
例子1
int *a[3];
只有一层,前面部分为 int *, 读作:’整数的指针’,后面部分为[3],读作‘数组’
所以a的类型为“整数的指针的数组”
注意:为了便于理解,在阅读时忽略数组的大小。
例子2
int * (*a)[3];
如下分解
层次 |
前面 |
后面 |
第一层 |
int * 整数的指针 |
[3] 数组 |
第二层 |
* 指针 |
(注:这部分为空,忽略) |
现在只要从上到下阅读表格中的每一行(每行从左到右读),:
“整数的指针的数组的指针”
为了便于理解,使用括号标出层次,“[ ( 整数的指针) 的数组 ] 的指针”—这是一个非常好用的一个方法,推荐使用。
例子3
int (*a[10])(int v);
如下分解
层次 |
前面 |
后面 |
第一层 |
int 整数 |
(int v) 参数为整形的函数 |
第二层 |
* 指针 |
[10] 数组 |
所以,a的类型为:
“[ (返回整数的,以一个整数为参数的函数) 的指针] 的数组”
为了便于理解,阅读时可以先忽略掉函数的返回值和类型信息,直接读为
“[ 函数的指针] 的数组”
chinaunix网友2009-04-01 09:24:50
呵呵 虽然有些不习惯(受右左法则影响),BUT,你这个方法真的很好理解,其实也不用理解,按照我们中国人的习惯,顺序读下来,就知道是什么了,赞13亿个!So good, so powerful!
cuichaox2009-03-19 12:39:27
例子3,如果对同一个事件,可注册多个回调函数的情况下,会用到,例如 (1)设计一个框架,网络上接收某种数据(假设类型为T_DATA),然后顺序调用个多个处理函数。 (2)所有的处理函数原型相同,可以放在函数指针的数组中:function_list const int MAX_FUNS = 10; void (*function_list[MAX_FUNS])(const T_DATA *); (3)框架的使用者,定义自己的处理函数,通过框架提供的接口,把这函数的地址注册到框架中, (添加到上面的数组中)。 (4)这种框架下,程序运行中,可以动态添加新的数据处理函数。
chinaunix网友2009-03-19 10:50:56
例子1: int *a[3]; //指向整数的指针数组 例子2:int * (*a)[3]; //(指向整数的指针数组)的指针 例子3:int (*a)(int v), //函数指针,一般在回调函数以及Windows DLL显式调用的时候使用。 int (*a[10])(int v);//函数指针的数组,这个函数有一个为int的参数,返回也为int。实际开发中暂时还未用过,感觉没有多大用。