指向函数的指针的使用

这篇博客主要介绍了C/C++中指向函数的指针的使用,包括指向函数的指针类型声明、初始化和赋值、调用方式,以及函数指针数组的声明和初始化。通过示例解释了如何使用函数指针作为参数传递,以及函数指针作为返回值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谈到这个话题,初学者可能在这方面较难看懂。不过对c/c++较熟悉的人来说,大家谈到指向函数的指针就会想到在排序中,那个以函数作为参数传递到排序函数中就是一个最典型的应用。

1.指向函数的指针的类型

指向函数的指针应该怎样声明?拿两个字符串的比较函数来说:
int  strCompare(const string & s1, const string & s2) ;
如果两个字符串相等就返回0,否则,s1< s2返回负数,s1 > s2返回正数其实函数名不是其类型的一部分,函数类型是只由它的返回类型和参数来决定。函数名称只不过是指向函数代码的地址。所以指向函数的指针的类型应该用下面的形式声名:


int (*pf)( const string &, const string & );

2.初始化和赋值

指向函数的指针可如下被初始化只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型
完全匹配时初始化和赋值才是正确的如果不匹配则将产生编译错误消息在指向函数
类型的指针之间不存在隐式类型转换。

int (*pfi)( const string &const string & ) = strCompare;
int (*pfi2)( const string &const string & ) = &strCompare;

指向函数的指针可以如下被赋值
pfi = strCompare;
pfi2 = pfi;

3.调用

如下代码:

#include <iostream>
using namespace std;

int min( int*int
 );
int (*pf)( int*int ) =
 min;

const int iaSize = 5
;
int ia[ iaSize ] = 74925 }
;

int
 main()
{
    cout 
<< "Direct call: min: "

        
<< min( ia, iaSize ) << endl;
    cout 
<< "Indirect call: min: "

        
<< pf( ia, iaSize ) << endl;
    
return 0
;
}

int min( int* ia, int sz ) 
{
    
int minVal = ia[ 0
 ];
    
for ( int ix = 1; ix < sz; ++
ix )
        
if ( minVal >
 ia[ ix ] )
            minVal 
=
 ia[ ix ];
        
return
 minVal;
}


4.函数指针的数组

我们可以声明一个函数指针的数组例如
int (*testCases[10])();
将testCases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针,该函数没有参数返回类型为int。
上面的声明等价于下面声明:

typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];


函数指针的数组可以用一个初始化列表来初始化该表中每个初始值都代表了一个与数
组元素类型相同的函数例如

int lexicoCompare( const string &const string & );
int sizeCompare( const string &const string &
 );
typedef 
int ( *PFI2S )( const string &const string &
 );
PFI2S compareFuncs[
2=

{
          lexicoCompare,
           sizeCompare
}
;
// 两个等价的调用
pfCompare[ 0 ]( string1, string2 ); // 编写
((*pfCompare)[ 0 ])( string1, string2 ); // 显式

5,参数和返回类型

函数参数的类型不能是函数类型函数类型的参数将被自动转换成该函数类型的指针
例如

// typedef 表示一个函数类型
typedef int functype( const string &const string & );
void sort( string *string *, functype );

编译器把sort()当作已经声明为
void sort( string *, string *,
int (*)( const string &, const string & ) );

上面这两个sort()的声明是等价的
注意除了用作参数类型之外函数指针也可以被用作函数返回值的类型例如
int (*ff( int ))( int*, int );
该声明将ff()声明为一个函数它有一个int 型的参数返回一个指向函数的指针类型

int (*) ( int*, int );

同样使用typedef 名字可以使声明更容易读懂例如下面的typedef PF 使得我们能更
容易地分解出ff()的返回类型是函数指针

typedef int (*PF)( int*, int );
PF ff( int );

函数不能声明返回一个函数类型如果是则产生编译错误例如函数ff()不能如下
声明
// typedef 表示一个函数类型
typedef int func( int*, int );
func ff( int ); // 错误: ff()的返同类型为函数类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值