mylogo

退役程序员的茶室 RetiredCoder.cn

← 返回上一页

C++编程基础: 17. 函数指针

2025-04-18 12:48:37

本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们来讲讲函数指针。

什么是函数指针

在介绍指针时我们知道了存储在内存空间中的数据如何通过指向它的指针来获得,同样,函数也会存储在内存之中,通过指向函数入口位置的函数指针,我们也可以在不直接调用函数的情况下,用函数指针来调用函数,另外,函数指针甚至可以作为一个函数的参数,传递到函数之中。

定义函数指针

定义函数指针时,可以参考对应的函数结构,它的一般格式为:

返回值类型(*自定义指针名称)(函数的参数列表);

下面代码是上节课时定义的打印动态数组某一项值的函数:

void printItem(const std::vector<int>& v, int index){    
    if(index>=v.size()){        
        throw "The value is bigger than index.";    
    }else{        
        std::cout<<"The index is:"<<index<<std::endl;        
        std::cout<<"The item is:"<<v[index]<<std::endl;    
    }
}

若要为这个函数定义一个指向它的函数指针,可以用如下的赋值语句:

void(*funcPrint)(const std::vector<int>& v, int index) = printItem;

这里的funcPrint是函数指针名称,它指向了printItem这个函数。

通过函数指针调用函数

定义函数指针后,程序就可以通过函数指针来调用对应的函数了,它的格式与调用函数的方法类似:

//printItem(myV,index); 
funcPrint(myV,index);

用关键字typedef定义函数指针

typedef是用来为某种数据类型定义新名字的关键字,它也可以帮助简化像声明函数指针这种复杂结构,让它可以像数据类型那样被使用。例如,下面的代码比较两个整数值的大小,返回最大值:

int max(int x, int y){    
    if(x>y){
        return x;
    }else{
        return y;
    }
}

用typedef可以定义一个这个函数结构的函数指针类型:

typedef int(*funcMax)(int x, int y) ;

这里的funcMax是一个函数指针类型,而不单单是指针,可以用这个新的类型声明一个函数指针pf,并把它指向实际的函数max:

funcMax pf = max;

通过这个funcMax类型的指针pf调用函数:

std::cout<<"1 and 8:"<<pf(1,8)<<std::endl;