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

菜菜菜攻城狮 2023-12-31 15:00:22

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

 

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

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;
}
...全文
74 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

857

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧