关于函数的指针参数


先做一道题目:

  

该程序的输出结果是多少?

==============================================

 

有人会认为输出的是“p = 5”,其实应该是一个不确定的数。

为了弄清为什么,先看下一个例子:

 

执行结果:

&i = bfffe924

p = bfffe924

*p = 1

&p = bfffe920

 

解析:

指针占4Byte,存放着它所指向的数据的地址。P是一个指向int型变量i的指针,所以p表示该指针的内容,也就是i的地址;*p表示p指向的内容,就是i;&p代表指针p本身的地址。

再看第一道题,main函数里的p和f函数的参数p都是指向int型的指针,当main函数调用f函数时:f(p),传递给f函数的是main函数中的p的内容,因为p没有初始化,所以它的内容是一个不确定的地址,所以,f函数中的p指向了这个不确定地址。


怎样才能让main函数中的p指向f函数中的静态变量i呢?

将程序做如下修改即可:

 

 

在 C++ 中,函数指针可以作为参数传递给其他函数,这种机制常用于实现回调函数、事件处理以及通用算法的扩展。定义一个带有函数指针参数的自定义函数需要明确函数指针的类型,确保调用者和被调用者之间的接口一致。 ### 定义带有函数指针参数函数 函数指针的声明形式为:`返回类型 (*指针变量名)(参数类型列表)`。若将其作为函数参数,则形式为:`返回类型 函数名(参数类型, 返回类型 (*函数指针名)(参数类型列表))`。 以下是一个示例,展示如何定义并使用带有函数指针参数的自定义函数: ```cpp #include <iostream> using namespace std; // 定义两个用于测试的简单函数 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } // 定义一个接受函数指针作为参数函数 int compute(int x, int y, int (*operation)(int, int)) { return operation(x, y); // 调用传入的函数指针 } int main() { int result1 = compute(10, 5, add); // 使用 add 函数作为回调 int result2 = compute(10, 5, subtract); // 使用 subtract 函数作为回调 cout << "Add result: " << result1 << endl; cout << "Subtract result: " << result2 << endl; return 0; } ``` ### 使用函数指针作为参数的场景 - **回调机制**:例如在 GUI 编程中,按钮点击事件通常通过函数指针来注册回调函数。 - **算法扩展**:标准库中的 `std::transform` 或 `std::for_each` 等函数允许传入函数指针以定义操作。 - **插件系统或模块化设计**:通过函数指针实现模块之间的解耦。 ### 注意事项 - 函数指针的类型必须与所指向函数的签名(返回类型和参数列表)完全匹配。 - 可以使用 `typedef` 简化函数指针类型的重复声明,提高代码可读性。 ```cpp typedef int (*MathOperation)(int, int); int compute(int x, int y, MathOperation operation) { return operation(x, y); } ``` 上述方式可以简化函数指针的使用,提高代码的可维护性。 [^1] [^2] ---
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值