C++ 从函数或方法返回动态内存(函数指针与指针函数)

函数指针与指针函数

函数指针:
如果在程序中定义了一个函数,那么编译时系统就会为这个函数分配一段存储空间, 这段存储空间的首地址称为这个 函 数 的 地 址。而且函数名表示的就是这个地址。既然是地址,我们就可以定义一个 指针变量来存放,这个指针变量就叫做 函 数 指 针 变 量,简称为 函 数 指 针。指向函数的指针包含了函数的地址的入口地址(首地址),可以通过它来调用函数。

定义函数指针:
那么这种指针变量如何定义呢,虽然同样是指向一个地址,但指向函数的指针变量与指向变量的指针在定义方式上是不同的,例如:

int(*p)(int x,int y);

上述语句定义了一个指向函数的指针变量 “p”,首先它是一个指针变量,所以p的前缀为" * "符,即 " *p ",其次前面的int表示这个指针变量可以指向返回值类型为int类型的函数( int(*p) ),后面参数列表括号中的两个int( “(int x,int y)” )表示这个指针变量可以指向有两个参数,且参数类型都是int类型的函数

所以这个语句的意思是:定义一个指针变量p,该指针变量可以指向返回值类型为int型,且有两个整型参数的函数,函数指针p的类型为[ int(*)(int,int) ];

函数指针的定义方式为:

函数返回值类型(*指针变量名)(函数参数列表);

函数返回值类型:表示该指针变量可以指向具有何种返回类型的函数
函数参数列表:表示该指针变量可以指向具有何种参数列表的函数,这个参数列表中只需要写函数的参数类型即可,不需要写参数的名字。

总结:🌟
函数指针的定义就是将 [ 函数声明 ] 中的 [ 函数名 ] 改成了 [ (*指针变量名) ] 。但需要注意的是: [ (*指针变量名) ] 两端的括号是不能省略的。括号改变了运算符的优先级,如果省略括号,就不是定义函数指针而是声明了一个返回值类型为指针的指针函数。

如何判断一个指针变量是指向变量还是指向函数:首先看变量名前面是否有 “*” 如果有,说明其首先是指针变量,其次看变量名后面有没有带形参列表的圆括号,如果有就是指向函数的函数指针,否则就是指向变量的指针变量。

注意:🎯
1.指向函数的指针变量没有++--运算。
2.函数指针调用函数时,函数指针与 被调用的函数的返回值类型,参数列表中参数的个数,参数的类型必须完全一致

如何用函数指针调用函数:
例如:

fun(int x,int y);

void main()
{
   

int (*p)(int x,int y); //声明一个函数指针 p
p=fun; //给函数指针p赋值,使它指向函数fun(将func函数的首地址赋值给指针p)
a=(*p)(x,y); //通过指针p调用函数fun

}

赋值时函数fun不带括号,也不带参数。这是因为函数名fun代表存放这个函数的内存空间的首地址,因此经过赋值给函数指针p以后,指针变量p就指向函数fun()的代码首地址了(也就是可以通过函数指针p调用这个fun()函数)。

函数指针的实际应用:

int max(int x, int y);

int main()
{
   
	int(*fp)(int x,int y);
	int a, b, c;
	fp = max;
	printf("请输入两个需要进行比较的值: ");
	cin >> a >> b;
	c = (*fp)(a, b);
	//todo 也可以写作 c = fp(a, b);
	printf("a=%d   b=%d 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值