指针函数和函数指针 “朝闻道”知识分享大赛

菜菜菜攻城狮 菜菜菜攻城狮 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

这是我参加“朝闻道”知识分享大赛的第五十七篇文章。

 

同指针数组和数组指针一样,主体都在后面,也就是指针函数是函数,函数指针是指针

1.指针函数

指针函数的本质是一个函数,其返回值为一个指针,也就是返回一个地址。

#include<iostream>
using namespace std;
 
int* myFunc()           //这就是一个指针函数,其本质是一个函数
{
	int a = 10;
	return &a;
}
 
 
void myFunc1(int *a){          //将要修改的数据的地址作为函数的参数,
    *a=10;                     //形参a会在栈区申请一个新的空间来改变a的值,
                               //函数结束的销毁的也是形参a的空间,原来实参的空间是还在的,
                               //所以实参的值是可以被改变的              
    
}
 
 
 
void test()
{
	int* p = myFunc();
	cout<<*p;
	cout<<*p;             //由于空间是生在栈区的,所以通过返回地址是没有办法拿到a的值的
 
}
 
void test01(){
    int a=20;
    myFunc1(&a);
    cout<<a;
}
 
 
int main(){
 
    test01();
    cout<<endl;
    test();
    return 0;
}

 

这是在栈中变量的创建和销毁过程:

 

2.函数指针

函数指针其本质是指针,指向一个函数。

 

#include<iostream>
using namespace std;
 
//函数指针:一个指向函数的指针
int add(int a, int b) {
	return a + b;
}
//先定义类型,用类型来定义指针
void test01() {
	typedef int(FUNC_TYPE)(int, int);   //声明add函数的类型
	FUNC_TYPE* myadd = add;             //通过函数类型来创建一个指向这个函数的指针
	int result = add(10, 20);
	cout<<result<<endl;
}
 
//直接定义函数指针类型
void test02() {
	typedef int(*FUNC_pTYPE)(int, int);
	FUNC_pTYPE f = add;                         //将add函数的地址给到这个函数指针类型
	int result = add(10, 20);
	cout<<result<<endl;
}
 
//直接定义函数指针变量!!!!!!!!!!!!!
void test03(){
	int(*f)(int, int) = add;                   //直接定义一个函数指针变量去指向add函数从而实现对它的调用
	int result = add(10, 20);
	cout<<result<<endl;
}
 
int main(){
 
    test01();
    cout<<endl;
    test02();
    cout<<endl;
    test03();
    return 0;
}

函数指针的一些应用场景:

#include<iostream>
using namespace std;
 
 
/**
* 函数指针的应用场景
* 1.函数指针数组
* 2.作为函数参数
*/
 
 
//1.函数指针数组
//先定义五个函数
int add1(int a, int b) {
	return a + b + 1;
}
int add2(int a, int b) {
	return a + b + 2;
}
int add3(int a, int b) {
	return a + b + 3;
}
int add4(int a, int b) {
	return a + b + 4;
}
int add5(int a, int b) {
	return a + b + 5;
}
void test1() {
	//指向函数的指针数组
	int (*p[])(int, int) = { add1,add2,add3, add4, add5 };
	int result=p[0](100, 200);        //p[0]相当于一个函数的地址
	cout<<result;
}
//2.函数参数
//第三个参数为一个函数
int allAdd(int a, int b, int(*func)(int, int)) {
	return func(a, b);
}
void test2() {
	int a = 100;
	int b = 100;
	int result = allAdd(a, b, add1);       //给函数allAdd传一个add1这个函数
	cout<<result;
}
 
int main(){
    test1();
    cout<<endl;
    test2();
    return 0;
}
...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部