对于一个函数:
void func(void);
我们通常可以定义一个这样的函数指针指向它:
void (*p)(void) = func;
通过p调用func时,通常有两种写法:
p();或者(*p)();
围绕这两种写法,当初C89制定的时候曾经有过争论。(*p)();是一种旧式的规定,旧式规定圆括号左边必须具有“函数”类型,如果是指向函数的指针,那么必须加上*声明符。但C89不再把圆括号的左边限定为“函数”类型,而是一个后缀表达式。那么问题就来了,如果p的值是函数地址,那么*号就是声明符,但如果p指向的内容是函数地址,*号就得被看作运算符了。同一种形式会有两种解释,这是一个矛盾。不仅函数调用如此,指向数组的指针也存在这种矛盾。编译器为了处理这种情况得增加代码,效率自然就降低了。争论的最后结果是谁也不能把对方完全说服,于是就干脆两种都支持了。笔者认为应该抛弃旧式的规定,p();这种形式简洁明了,又符合函数的一般形式,何乐而不为?
第八章练习的答案,同时给出用typedef的分解方法:
int (*(*func)[5][6])[7][8];
func是一个指向数组的指针,这类数组的元素是一个具有5X6个int元素的二维数组,而这个二维数组的元素又是一个二维数组。
typedef int (*PARA)[7][8];
typedef PARA (*func)[5][6];
int (*(*(*func)(int *))[5])(int *);
func是一个函数指针,这类函数的返回值是一个指向数组的指针,所指向数组的元素也是函数指针,指向的函数具有int*形参,返回值为int。
typedef int (*PARA1)(int*);
typedef PARA1 (*PARA2)[5];
typedef PARA2
(*func)(int*);
int (*(*func[7][8][9])(int*))[5];
func是一个数组,这个数组的元素是函数指针,这类函数具有int*的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。
typedef int (*PARA1)[5];
typedef PARA1 (*PARA2)(int*);
typedef PARA2
func[7][8][9];
分享到:
相关推荐
编译原理课后习题解答第十章……&*(()
c语言第十章c语言第十章c语c语言第十章c语言第十章c语言第十章言第十章c语言第十章cc语言第十章c语言第十章c语言第十章语言第十章c语言第十章
Windows程序设计第十章 Windows程序设计第十章
第十章社会结构与教育制度.ppt
北大青鸟JavaScript第十章完整项目案例
组成原理 唐硕飞 第二版 第十章部分答案
第十章 类与对象 C++重难点知识
物理学(第五版)课后习题答案第十章 物理学(第五版)课后习题答案第十章
北大版高数第十章习题解答,是北大版高数下册内容。。
计算机导论第十章人工智能基础习题及参考答案.docx计算机导论第十章人工智能基础习题及参考答案.docx计算机导论第十章人工智能基础习题及参考答案.docx计算机导论第十章人工智能基础习题及参考答案.docx计算机导论...
Visual C++范例大全第十章,从第十章以后不要金币...
郑晓薇版汇编语言PPT课件,从第3章到第十章的PPT,经典中的经典。至此,十章ppt全部上传完成
通信原理习题答案第十章习题解答.doc
计算机网络课后答案第十章 计算机网络课后答案第十章
C Primer Plus第十章 编程练习答案,亲测编译运动通过。
Java语言程序设计基础第十版第十章课后复习题答案.
第十章 GPS应用PPT课件
第十章保险市场与监管PPT,第十章保险市场与监管,第十章保险市场与监管课件
高级会计学第十章课后参考答案.doc
编译原理及实现第十章的课后答案 有详细的图文解说 简单易懂