分类: C/C++
2013-07-09 14:14:09
最近重新研读了c语言指针方面的资料,现在对c语言中复杂声明进行总结。
这里指的复杂声明指的是解读像下面这种声明代码含义的。
int (*(*x)(int *,char *))(int);
(以上代码声明了一个函数指针,这个函数接收一个整型指针和一个字符指针作为参数,函数指针,这个函数接收一个整型参数,返回一个整型。)
例如:声明一个函数指针
double (*fun)(double);
使用这个函数指针
#includefun=sin; doube reslut=(*fun)(0.5);//use point fun
这一点非常重要,是判断一个声明到底是声明了一个什么变量的准则。具体讲有三类声明符:
* () [ ]
其中“*”声明指针,各种各样的指针,包括函数指针;
“()”是专门用来声明函数指针的;
“[ ]”是用来声明数组的。
三个运算符“[ ]”和“()”的优先级别最高,结合律是“自右向左”。
明确了这两点后,我们就可以使用这两点来解读复杂声明了。
具体规则:首先从声明的变量符开始根据优先级进行阅读,判断定申明了一个什么变量。然后一层一层逐级向外拆开。*则申明了指针;[ ]则申明了数组;()则申明了函数。
例如解读本文一开始的例子:
int (*(*x)(int *,char *))(int);
首先找到x,然后根据优先级找到*x,则证明整条语句声明了一个指针。再继续看到(*x)右边是一个()符,则证明x是一个指向函数的指针,既然是函数指针那剩下的部分就是描述函数返回值类型和参数类型;再看()里则可以解读出函数的输入是一个整型指针和一个字符指针。然后再以“(*x)(int *,char *)”为整体看,找到优先级最高的是*符号,则证明返回值是一个指针;再继续看找到了(int)则证明这个指针是指向一个函数的,函数的参数是整型;再继续找到最后一个int,则看出这个函数的返回值是一个整型。到此解读完毕。
简要的说就是:声明了一个函数指针,这个函数接收一个整型指针和一个字符指针作为参数,返回函数指针,这个函数指针指向的函数接收一个整型参数,返回一个整型。
double(*(*y[3])())[10]
同理:这里又声明了一个长度为3的数组,数组元素为函数指针,指向的函数返回一个指针,该指针又指向仪个长度为10的double型数组。