Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80771
  • 博文数量: 44
  • 博客积分: 2021
  • 博客等级: 大尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-03 10:12
文章分类
文章存档

2011年(1)

2010年(9)

2009年(34)

我的朋友

分类: C/C++

2009-03-23 15:28:56

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

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

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

[ 函数的指针] 的数组”

 发表于: 2009-03-17,修改于: 2009-03-17 12:38 已浏览498次,有评论3条 推荐 投诉

  网友评论
  龚申行 时间:2009-03-18 10:19:59 IP地址:221.130.253.★
这次看懂了,支持原创,越多越好。

  bluex 时间:2009-03-19 10:50:56 IP地址:123.124.236.★
例子1: int *a[3];     //指向整数的指针数组
例子2:int * (*a)[3]; //(指向整数的指针数组)的指针
例子3:int (*a)(int v),    //函数指针,一般在回调函数以及Windows DLL显式调用的时候使用。
       int (*a[10])(int v);//函数指针的数组,这个函数有一个为int的参数,返回也为int。实际开发中暂时还未用过,感觉没有多大用。

  cuichaox 时间:2009-03-19 12:39:27 IP地址:211.94.74.★
例子3,如果对同一个事件,可注册多个回调函数的情况下,会用到,例如
 (1)设计一个框架,网络上接收某种数据(假设类型为T_DATA),然后顺序调用个多个处理函数。
 (2)所有的处理函数原型相同,可以放在函数指针的数组中:function_list
            const int MAX_FUNS = 10;
            void (*function_list[MAX_FUNS])(const T_DATA *);
 (3)框架的使用者,定义自己的处理函数,通过框架提供的接口,把这函数的地址注册到框架中,    (添加到上面的数组中)。
 (4)这种框架下,程序运行中,可以动态添加新的数据处理函数。
阅读(1446) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~