982
社区成员
发帖
与我相关
我的任务
分享
这是我参加“朝闻道”知识分享大赛的第五十七篇文章。
同指针数组和数组指针一样,主体都在后面,也就是指针函数是函数,函数指针是指针
指针函数的本质是一个函数,其返回值为一个指针,也就是返回一个地址。
#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;
}
这是在栈中变量的创建和销毁过程:
函数指针其本质是指针,指向一个函数。
#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;
}