函数指针的解引用

声明函数的引用:

  1. int f( double );  
  2. int (* const pf)(double) = f;       // pf是指向函数f()的常量指针  
  3. int (&rf)(double) = f;               // rf是函数f()的引用 

从编码实践角度来看,指向函数的常量指针和函数的引用并无很大不同。除了一点,那就是指针可以显式地使用反引用语法,而对引用是不能使用显式反引用语法的,除非它被隐式转换成指向函数的指针 。

  1. a = pf( 12.3 );                      // 直接用函数指针名调用函数  
  2. a = (*pf)(12.3);                    // 使用反引用语法也是可以的  
  3. a = rf( 12.3 );                      // 通过引用调用函数  
  4. a = f( 12.3 );                       // 直接调用函数本身  
  5. a = (*rf)(12.3);         // 把引用(隐式)转换成指向函数的指针,再使用反引用语法  
  6. a = (*f)(12.3);          // 把函数本身(隐式)转换成指向函数的指针,再使用反引用语法 

(注:此处六行代码主要想说明,C++的函数调用很灵活,无论是通过使用函数名本身、指向函数的指针还是函数的引用来调用函数,都既可以用名字本身,也可以使用反引用语法。尽管后两行在语法上其实是经过了一个隐式类型转换,因而会带来效率上的损失。)

这是《C++语言99个常见编程错误》错误5中的一段话。

 

说反引用可能有点莫名奇妙,其实它就是解引用,只是翻译过来不同罢了。

 

上面声明函数指针时,

int(* const pf)(double)易可为int(* const pf)(double) = &f; 此处的原因为:将一个函数的地址初始化或赋值给一个指向函数的指针时,无需显式地取得函数地址,编译器知道隐式地获得函数的地址,即在此种情况下,&操作符是可选的,通常省略不用。

 

然后对于引用的解引用,由编译器隐式转换成指向函数的指针,否则编译不通过。

当然要是真想编无聊的代码,后两句可以类似写成这样 a = (*****************rf)(12.3);    其中意思参考上面你应该懂的。 

### 关于C++函数指针调用中的解引用 在C++中,当涉及到函数指针的使用时,存在两种常见的做法来调用指向的函数:直接使用函数指针名称以及显式地对其进行解引用。这两种方式均能实现相同的功能,即执行由该指针所指向的具体函数。 对于`funcptr(1, 2)`这种形式来说,在语法上是允许的,并且编译器会自动处理内部机制完成必要的转换工作[^1]。这意味着即使没有显示写出解引用操作符(*),实际上也会按照(*funcptr)(1,2)的方式去解释并运行这段代码。因此,无论是采用哪种写法——`funcptr(1, 2)`还是`(*funcptr)(1,2)`——最终的效果都是相同的;它们都会成功调用指定参数下的目标函数。 然而值得注意的是,尽管两者功能一致,但在某些情况下更推荐使用不带星号的形式(`funcptr()`),因为这使得代码更加简洁易读,同时也减少了可能出现误解的机会。而对于类成员函数而言,则通常需要借助额外的帮助(比如std::mem_fn或lambda表达式),才能正确创建相应的函数对象来进行间接调用。 ```cpp #include <iostream> // 定义一个简单函数用于演示 void greet(const char* name){ std::cout << "Hello, " << name << "!" << std::endl; } int main(){ // 声明一个指向 void (const char*) 类型函数的指针 void (*greetPtr)(const char*); // 将函数 'greet' 的地址赋给 greetPtr greetPtr = &greet; // 使用两种不同方法调用此函数指针 greetPtr("Alice"); // 方法一:隐含解引用 (*greetPtr)("Bob"); // 方法二:显式解引用 return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值