Zade's Weblog
程序人生
Monthly Archives: 10月 2010
C++指针类型
2010年10月14日
Posted by 于 看到一类面试题,如下:
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
在上面的定义中,除了函数指针让人繁琐以外,还有数组指针和指针数组的相互混淆.
那么,判断的依据是什么呢?
- 首先,如果表达式的最后是(),里面有若干个参数类型,那么这个肯定是和函数指针相关,要么本身是一个函数指针,要么返回值实施一个函数指针
- 变量前面是*,那么首先表示这是一个指针;如果是**,二级指针
- 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;
这样会更加的清晰.