千家信息网

C++的函数指针用法

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要讲解了"C++的函数指针用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++的函数指针用法"吧!看C++代码时看到了一段很新奇的用法,
千家信息网最后更新 2025年12月03日C++的函数指针用法

这篇文章主要讲解了"C++的函数指针用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"C++的函数指针用法"吧!

看C++代码时看到了一段很新奇的用法, 回来剖析了一下, 感觉虽然原理很简单还是值得记录一下的。

代码大概是这个样子的:

class test {
public:
void a1(){printf("test::a1\n");};
}

int main()
{
test *t = new test();
void (test::*a)(void);
a = &test::a1;
(t->*a)();
}

以前在C++中用函数指针时,从来都反射性的去用静态成员函数, 却从来都没想到原来普通的成员函数也是可以使用函数指针的。

仔细分析一下, 原理也早就知道。 无非就是this指针的事。

使用test对象的指针去调用某函数与普通的C函数指针惟一的区别就是, 会将test对象的指针作为this指针通过ecx寄存器来传入, 那么所有的C++类成员函数在本质上也是通过ecx的值来访问他们的成员变量。


在不反汇编的情况下, 为了更清晰的验证一下上述结论, 加入了如下代码:

void (*b)(void);
b = (void (*)(void))&test::a1;
b();

最后可以发现函数依然可以运行。

当然这里其实有点取巧,因为test::a1函数并没有访问类的成员变量, 所以我们可以将此成员函数直接作为普通的函数来调用。


如果test::a1函数访问成员变量的话, 由于C函数调用时并没有传入this指针, 那么test::a1函数必将会由于随机的ecx值而导致崩溃。

但是这段代码已经足够证明,&test::a1给出的是函数的绝对地址与普通的C函数的地址并无两样,那么调用b()和(t->*a)()的区别其实就在于是否传入了this指针。

如果再有点hack精神, 其实可以去将test::a1函数更改为访问成员变量, 然后在调用C函数前, 可以手动内嵌asm代码来将ecx值强制改为t的指针值, 如果效果一样, 那么即可完全证明上述结论。

感谢各位的阅读,以上就是"C++的函数指针用法"的内容了,经过本文的学习后,相信大家对C++的函数指针用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

函数 指针 成员 C++ 代码 普通 变量 就是 学习 内容 原理 地址 对象 情况 结论 验证 新奇 没想到 中用 寄存器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 内网服务器登记管理系统 有关网络安全的英语作文高中 计算机网络安全的问题不包括 网络清朗工程 网络安全 北京易点淘网络技术有限 湖北省网络技术安全 移动网络安全现状分析 数据库查询成绩总分由高到低 甘州区青少年网络安全知识 滨湖区软件开发咨询热线 无锡智能化软件开发概念 知乎微博软件开发商怎么盈利 服务器 直流供电 余干公路分局网络安全宣传 延边大学网络安全研究室 金融网络安全宣传周领导讲话 怀孕去服务器机房 银川办公软件开发公司价格 美团外卖软件开发的意图 岳阳软件开发培训有哪些 南京通用软件开发代理商 北京易点淘网络技术有限 网络安全面试表 一对一交友软件开发定制 河北什么是网络技术咨询 代理订货软件开发 华为服务器技术支持 数据库可以导入什么类型的数据 淘宝上不能卖数据库了 软件开发哪个城市好
0