| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 关于函数指针以及由函数指针引起的混乱 -> 正文阅读 |
|
[C++知识库]关于函数指针以及由函数指针引起的混乱 |
目录 【问题引入】函数指针是什么? ????????一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。 ????????简而言之,函数指针就是利用一个指针变量来指向函数,利用该指针变量来调用函数。 函数指针的定义形式:
????????注意 ? ? ? ??使用函数指针时,首先要对其进行定义,例如下面的式子: 【例1】
? ? ? ? 这样我们就可以直接利用指针变量来调用函数。 ? ? ? ? 接下来我们来看看这段代码,注意其中的区别: 【例2】
【问题1】我们发现第一个例子中使用:
而第二个例子中使用:
其产生的结果没有任何差异(接下来我们会讲原因)。同理第二个例子中定义的指针变量p也是同样的道理,那么就有:
?【由函数指针引起的混乱】? ? ? ? 这里不得不重新说明一下函数,我们知道当我们创建一个函数时,会有一个函数名,这个函数名实际上是一个指针变量,指向函数体,函数体存储在代码段(Text Segment)中,指针变量存储在栈中。即创建一个函数实际上就创建了一个指向函数体的指针变量。 ? ? ? ? 那么当我们创建一个函数指针时,理应存在这样一个示意图: ? ? ? ? 这里可能会有同学要问这样一个问题: 【问题2】
????? ?在C语言中,表达式中的函数可以被解读成“指向函数的指针”,如果基于C语言函数的声明规则,int func() 这样的声明会被解释为“返回int类型的函数”,如果函数位于表达式中,只是取出func解释成“指向函数的指针”,这样使用会不会感到很怪异 ? 【理解1】???????? 这里就产生了对于函数指针使用的两种不同的特殊情况:
? ? ? ? ?是不是感觉C语言关于指向函数的指针的语法比较奇怪? ? ? ? ? 混乱产生的原因就是:“表达式中的函数可以解读为‘指向函数的指针’这个意图不明的规则(为了与数组保持一致)” ?【理解2】? ? ? ? 为了照顾到这种混乱,ANSI标准对语法做了一下例外的规定:
????????那么为什么【问题1】中可以使用 *pmax(a,b)呢? ? ? ? ? 这里简单解释一下。如果对“指向函数的指针”使用解引用*,它会暂时成为函数,但是因为在表达式中,所以会被瞬间地变回成“指向函数的指针”。?即使对“指向函数的指针”使用*运算符,也是对牛弹琴,因此此时的运算符*发挥不了任何作用。 ????????因此,以下句子也是可以正常执行:
????????那么以上问题就已经解决了。 【特殊引用】? ? ? ? ?由于数组和指针的一致性,我们甚至可以这样来引用。 ? ? ? ? ??【我的问题】? ? ? ? 上面我们指出函数名是一个指针变量,这个指针变量指向函数体,那么为什么会出现这样的输出结果呢? ? ? ? ? 希望有大佬在评论区发表自己的意见,这个问题我不理解,求助!!!!
? ? ? ? ? ? ? 为什么 max 和 &max的结果一样呢?难道 max 不应该是一个指针变量嘛? ? ? ? ? ? ??经过我一晚上的胡思乱想,我有了一个不太成熟的想法,来解释这个问题:
? ?希望有大神指正!!! |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:15:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |