Chinaunix首页 | 论坛 | 博客
  • 博客访问: 947904
  • 博文数量: 134
  • 博客积分: 7443
  • 博客等级: 少将
  • 技术积分: 1411
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 20:18
文章分类

全部博文(134)

文章存档

2012年(7)

2011年(29)

2010年(16)

2009年(6)

2008年(18)

2007年(58)

分类: 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的类型为:

[ (返回整数的,以一个整数为参数的函数) 的指针] 的数组”

为了便于理解,阅读时可以先忽略掉函数的返回值和类型信息,直接读为

[ 函数的指针] 的数组”

阅读(2849) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

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。实际开发中暂时还未用过,感觉没有多大用。

chinaunix网友2009-03-18 10:19:59

这次看懂了,支持原创,越多越好。