带你轻松理解函数指针 C/C++

函数指针的定义

想要指定函数的返回值 (*指针的名称)(参数1,参数2,…);

//意思就是想指向的那个函数的返回值为void类型
//并且该函数有两个参数,第一个参数为string*类型,第二个参数为int类型
//该指针的名称是p
void (*p)(string*,int );   

举例说明

注意看里面的注释

#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;

//数组在形参中会退化成指针
void yue1(string steps[], int n) {
	for (int i = 0; i < n; i++) {
		cout << "我们一起" << steps[i] << "吧" << endl;
	}
}



void yue2(string steps[], int n) {
	cout << "我们一起" << steps[0] << "吧" << endl;
	cout<< "我们一起" << steps[n-1] << "吧" << endl;

}


int main() {

	string gonglue[] = { "喝奶茶","吃夜宵","看电影" };
	/*
	*p就是一个函数指针,是一个指向返回值为void
	*且第一个参数为string*
	*第二个参数为int
	*/
	void (*p)(string*, int);
	//给函数指针赋值
	p = yue1;//函数名是地址,不过你也可以加&,加上也还是地址效果一样
	p(gonglue, 3);
	
	cout << "\n******************\n" << endl;
	//指向yue2函数
	p = yue2;
	p(gonglue, 3);
	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

函数指针的其他写法

如果每个函数指针都要像之前那样定义的话,那么想想就麻烦

void (*p)(string*,int );   
void (*p1)(string*,int );
void (*p)(string*,int );      

这样是不是有点不舒服,所以我们要用到typedef来简化我们的函数指针的写法,不过在对于函数指针的用法中和以往对于普通变量的重新命名不一样,看代码和注释!!

#include<iostream>
#include<string>
#include<Windows.h>
using namespace std;

//定义了一种数据类型,数据类型的名字叫做p_t
//使用这种数据类型定义的变量就是函数指针
typedef void (*p_t)(string*, int);  //这里用的typedef比较特别,这里的用法就是函数指针的特有的typedef操作和以往的typedef int int32;不一样
p_t p;  //等效于void (*p)(string*, int);

void yue1(string steps[], int n) {
	for (int i = 0; i < n; i++) {
		cout << "我们一起" << steps[i] << "吧" << endl;
	}
}


void yue2(string steps[], int n) {
	cout << "我们一起" << steps[0] << "吧" << endl;
	cout << "我们一起" << steps[n - 1] << "吧" << endl;

}


int main() {

	string gonglue[] = { "喝奶茶","吃夜宵","看电影" };
	/*
	*p就是一个函数指针,是一个指向返回值为void
	*且第一个参数为string*
	*第二个参数为int
	*/
	//void (*p)(string*, int);
	给函数指针赋值
	//p = yue1;//函数名是地址,不过你也可以加&加上也还是地址
	//p(gonglue, 3);
	//cout << "\n******************\n" << endl;
	//p = yue2;
	//p(gonglue, 3);
	p_t p1 = yue1;
	p1(gonglue, 3);
	
	cout << "\n**********************\n" << endl;
	p_t p2 = yue2;
	
	p2(gonglue, 3);
	return 0;
}

运行结果:
在这里插入图片描述
函数指针还是蛮重要的,希望这篇文章能帮助到大家,如果该文章存在一些问题或者说是有不同理解的话希望同学们都可以提出来,谢谢😁(。・∀・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值