第十章 围绕p()与(*p)()的争论 - 飞天御剑流
来源:百度文库 编辑:神马文学网 时间:2024/05/04 14:55:39
第十章 围绕p()与(*p)()的争论
对于一个函数:
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];
本文引用通告地址: http://blog.csdn.net/megaboy/services/trackbacks/482767.aspx
[点击此处收藏本文]
对于一个函数:
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];
本文引用通告地址: http://blog.csdn.net/megaboy/services/trackbacks/482767.aspx
[点击此处收藏本文]
第十章 围绕p()与(*p)()的争论 - 飞天御剑流
第十章 围绕p()与(*p)()的争论
第十章 围绕p()与(*p)()的争论
飞天[14P]
谈谈围绕劳动价值论问题的争论
谈谈围绕劳动价值论问题的争论
建国后围绕国号的争论:“中华人民共和国”还有简称?
第九章 指针与const - 飞天御剑流
曾浩画的敦煌飞天美女 美得令人窒息[28P]
第二章 再一次吃惊----数组的数组与多维数组的区别 - 飞天御剑流
'..p
【绘画集锦】第十辑: 中国古画人物画 <下>(34P)
我与神的对话[12P]
美丽的月亮与星星(15P)
明星与著名主持人的另一半【90P】
明星与著名主持人的另一半【92P】
高清电视的P与I
明星与著名主持人的另一半【92P】
明星与著名主持人的另一半【92P】
数码单反AUTO模式与P模式的异同与使用
数码单反AUTO模式与P模式的异同与使用
P;P
杨立华与李零的争论
胡绩伟与胡乔木的争论