`
michael-java
  • 浏览: 18853 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

第十章 围绕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];

分享到:
评论

相关推荐

    编译原理课后习题解答第十章

    第十章的课后习题解答围绕这一主题展开,深入探讨了不同参数传递方式的实现原理及其实现细节,下面我们将详细解析这些知识点。 #### 参数传递方式及其原理 **传值(Call by Value)**:这种参数传递方式是最常见的,...

    Windows程序设计第十章

    Windows程序设计第十章 Windows程序设计第十章

    第十章社会结构与教育制度.ppt

    第十章社会结构与教育制度.ppt

    C Primer Plus第十章 编程练习答案

    ### C Primer Plus第十章编程练习知识点解析 #### 练习一:二维数组处理与降雨量统计 本练习涉及的关键概念包括二维数组、指针、循环结构等。 **代码解析** 1. **预处理指令与宏定义**:首先,程序通过`#include...

    JavaScript第十章完整案例

    在这个"JavaScript第十章完整案例"中,我们将会探索北大青鸟课程体系中关于JavaScript的高级应用和实战项目,这将帮助我们理解如何将理论知识转化为实际操作。 在JavaScript的第十章,通常会涵盖诸如DOM操作、事件...

    北大版高数第十章习题解答

    根据给定的文件标题“北大版高数第十章习题解答”及部分描述内容,我们可以看到这是一份关于北京大学出版的高等数学教材中第十章练习题的答案解析。这部分内容主要涉及了级数的相关理论和应用问题,特别是针对收敛性...

    郑晓薇版汇编语言PPT课件从第三章到第十章

    郑晓薇版的汇编语言PPT课件是学习汇编语言的重要参考资料,涵盖了从第三章到第十章的丰富内容。这些章节包含了汇编语言的基础和进阶知识,对于理解和掌握计算机底层工作原理至关重要。 第三章通常会介绍汇编语言的...

    数据结构(严蔚敏)第十章:内部排序

    严蔚敏教授的《数据结构》是一本经典的教材,其中第十章专门讲解了内部排序算法。内部排序,指的是数据在计算机内存中进行的排序过程,相对于外部排序,其处理的数据量相对较小,但要求快速、高效。 在这一章中,...

    通信原理习题答案第十章习题解答.doc

    通信原理习题答案第十章习题解答.doc

    物理学(第五版)课后习题答案第十章

    《物理学(第五版)》是物理学教育中一本重要的教材,其第十章通常涵盖了经典力学中的重要概念和原理。本章的课后习题旨在帮助学生深入理解和应用这些知识,巩固课堂所学。以下是对第十章部分习题的解析: 1. ...

    C程序设计(第五版)课后答案-第十章

    第十章作为全书的最后一章,通常会涵盖一些高级和实用的主题,旨在帮助读者深入理解C语言的精髓,并提升编程能力。在这一章的课后习题答案中,我们可以发现以下几个重要的知识点: 1. **指针与动态内存管理**:在...

    计算机网络课后答案第十章

    计算机网络课后答案第十章 计算机网络课后答案第十章

    第十章 类与对象

    ### 第十章 类与对象 —— C++ 重难点知识详解 #### 一、引言 C++ 是一种广泛应用于工业界的编程语言,它既继承了 C 语言的强大功能,又引入了面向对象编程(OOP)的概念。面向对象编程的核心在于类与对象的设计与...

    visual c++典型模块与实战大全 第十章代码

    《Visual C++典型模块与实战大全》第十章的代码涵盖了C++编程中的多个核心主题,这些主题对于理解和掌握Microsoft的Visual C++环境至关重要。在这一章中,开发者将深入学习如何利用C++的强大功能来构建高效、可维护...

    软件测试课件第十章

    软件测试课件第十章

    第十章保险市场与监管PPT课件.ppt

    第十章保险市场与监管PPT,第十章保险市场与监管,第十章保险市场与监管课件

    Java语言程序设计基础第十版第十章课后复习题答案

    ### Java语言程序设计基础第十版第十章课后复习题答案解析 #### 10.1 习题 **问题:** 如果重新定义程序清单10-2中的2中的Loan类,去掉其中的设置方法,这个类是不可改变的吗? **答案:** 是可以。 **解析:** 当一...

    算法导论第十章习题解答

    第十章通常涉及到图算法,这是计算机科学中不可或缺的一部分,尤其是在网络、路径搜索、最优化问题等领域有着广泛应用。本解答集主要针对第十章的习题,提供代码实现或解题思路。 1. **图的基本概念**:在图算法中...

    Visual C++范例大全第十章,从第十章以后不要金币...

    在本节中,我们将深入探讨《Visual C++范例大全》第十章中的核心知识点——文件操作与注册表编程。Visual C++作为微软的C++开发环境,提供了丰富的库支持,使得开发者可以方便地进行文件管理和注册表操作,这对于...

Global site tag (gtag.js) - Google Analytics