浅谈函数指针

一、函数的地址

在一个程序中,不仅仅是变量需要分配内存,函数也一样,那么函数自然也可以有指针,是函数的入口地址。

函数的地址就是函数名

// 变量t的地址是:&t
int t;


// 这个函数的地址是它的函数名,也就是 function
void function(int a) {
	cout << a << endl;
}

二、定义函数指针

声明函数指针是必须指定函数的返回值类型与参数类型。表明这个指针,只能指向这种形式的函数。

void add(int a, int b) {
	cout << a + b << endl;
}

函数指针声明只比函数声明多一个 * 和一对括号,例如:

void (*pa)(int, int);

其中*pa 括起来的括号一定不能少

三、使用函数指针

注意:传递实参的时候是直接传递函数指针(地址)或函数名(地址),不用传递函数内的参数。

例如:f(3, 1, pa);f(3, 1, add);,可以这样认为:

  • 函数名 add 是一个函数指针常量,本身就是函数的地址
  • 定义的函数指针 pa 是一个函数指针变量,表示的也是地址

具体实例代码:

#include <iostream>

using namespace std;

void add(int a, int b) {
    cout << a + b << endl;
}

void sub(int x, int y) {
    cout << x - y << endl;
}

int plus(int m, int n) {
    return m + n;
}

// 参数表中:声明一个函数指针pa,接受地址(函数名)参数
void f(int i, int j, void(*pa)(int, int)) { 
    // 如果pa = add,那么说明函数指针 pa 指向 add 函数
    // 如果pa = sub,那么说明函数指针 pa 指向 sub 函数
    
    // *pa相当于调用这个函数,并传入参数i,j
    (*pa)(i, j); 
    // pa(i, j); C++允许直接写 pa 来调用函数,但本质是 (*pa)
}

int main() {
    void (*pa)(int, int); // 定义函数指针pa,只指定输入输出类型就可以
    pa = add; // add是函数名所以是地址,而指针本质就是地址
    
    f(3, 1, pa);
    // 输出4
    
    pa = sub;
    f(3, 1, pa);
    // 输出2

 	// pa = plus; ERROR 因为pa不能指向返回值是int的函数
    return 0;
}

再强调一下:

在使用函数指针时 C++ 允许直接写 pa 来调用函数,但本质 (*pa),所以下面两行代码是等价的:

(*pa)(i, j); 
pa(i, j);   // 本质是(*pa)(i, j);

建议写 (*pa)(i, j);,因为这样表明我用的是函数指针,而不是普通的函数用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值