Zade's Weblog

程序人生

Monthly Archives: 10月 2010

密码保护:百度

此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

C++指针类型

看到一类面试题,如下:

Write in words the data type identifier involved in the following definations:

1) float (**def)[10]

2) double* (*gh)[10]

3)double (*f[10])()

4) int* ((*b)[10])

5) int (* (*F(int,int))(int)

我们先看答案:1)二级指针,指向一个10个元素的数组,数组的类型是float

2) 指针,指向一个数组,数组有10个元素,类型是double*

3)函数指针数组,10个元素,函数的类型是返回值是double,没有参数

4)指针,指向一个数组,数组的个数是10,类型是int*

5)函数指针,函数参数是两个int,返回值是一个函数指针,这个函数的返回值是int,一个参数,类型是int

在上面的定义中,除了函数指针让人繁琐以外,还有数组指针和指针数组的相互混淆.

那么,判断的依据是什么呢?

  1. 首先,如果表达式的最后是(),里面有若干个参数类型,那么这个肯定是和函数指针相关,要么本身是一个函数指针,要么返回值实施一个函数指针
  2. 变量前面是*,那么首先表示这是一个指针;如果是**,二级指针
  3. T* var[X],这是数组指针,即指向指针的数组,T (*var)[X],这是指针数组,指向数组的指针,和T var2[10]不同的是,var是可变的,var2不可变

对于函数指针,在实际的工程应用中,我们一般使用typedef,例如:

int Func(int){}

与其:int (*f)(int) = &Func

不如: typedef int (*Func_Type)(int); Func_Type f = &Func;更加的清晰.

还有,int (* (*F(int,int))(int),我们可以:

typedef int (*Func_Type)(int);

typedef Func_Type (*Func_Type2)(int,int);

Func_Type2 F = NULL;

这样会更加的清晰.