C/C++ 中的强大组合:指针与函数

一、指针变量作为函数的参数

如果想在函数内部修改外部变量的值,需要将外部变量的地址传递给函数。

1.1、单向传递:值传递

函数内部不能修改外部变量的值。

#include <iostream>

using namespace std;

void set(int num2)// 相当于 int num2=num;

{

num2=10;

}

int main()

{

int num=1;

set(num);

cout<<"num = "<<num<<endl;

return 0;

}

输出:

num = 1

1.2、单向传递:传地址

函数内部可以修改外部变量的值。

#include <iostream>

using namespace std;

void set(int *p)// 相当于 int *p=&num;

{

*p=10;

}

int main()

{

int num=1;

set(num);

cout<<"num = "<<num<<endl;

return 0;

}

输出:

num = 10

二、数组作为函数的参数传递

函数内部想操作外部数组元素,将数组名传递给函数。

• 一维数组作为函数的参数,会被编译器优化为指针变量。

• 二维数组作为函数的形参会被优化成一维数组指针。

(1)一维数组作为函数的参数传递:

#include <iostream>

using namespace std;

void foreach(int p5)//优化成void foreach(int *arr)

{

cout<<"sizeof(p) = "<<sizeof(p)<<endl;

//遍历

for(int i=0;i<5;i++)

{

cout<<pi<<" ";

}

cout<<endl;

}

int main()

{

int num5={1,2,3,4,5};

cout<<"sizeof(num) = "<<sizeof(num)<<endl;

foreach(num);

return 0;

}

输出:

sizeof(num) = 20

sizeof(p) = 4

1 2 3 4 5

(2)二维数组作为函数的参数传递:

#include <iostream>

using namespace std;

// void foreach(int (*p)4,int row,int col)和下面的等价

void foreach(int p34,int row,int col)

{

cout<<"sizeof(p) = "<<sizeof(p)<<endl;

//遍历

for(int i=0;i<col;i++)

{

for(int j=0;j<col;j++)

cout<<pij<<" ";

cout<<endl;

}

cout<<endl;

}

int main()

{

int num34={

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

cout<<"sizeof(num) = "<<sizeof(num)<<endl;

foreach(num,sizeof(num)/sizeof(num0),sizeof(num0)/sizeof(num00));

return 0;

}

输出:

sizeof(num) = 48

sizeof(p) = 4

1 2 3 4

5 6 7 8

9 10 11 12

三、函数的返回值类型是指针类型

将函数内部的合法地址通过返回值返回给函数外部使用。

注意:函数不要返回普通局部变量的地址,返回普通局部变量的地址会出现段错误,使用一个已经释放的内存空间的行为是未定义的。但是,可以返回静态变量的地址,因为静态变量的生命周期是整个进程,所以是一个合法的地址。

#include <iostream>

using namespace std;

int* test()

{

// int data=1;

// return &data;

static data=2;

return &data;

}

int main()

{

int *p=test();

cout<<"test return "<<*p<<endl;// 输出2

return 0;

}

四、函数指针

4.1、函数指针的定义

函数名代表函数的入口地址。函数指针本质上是一个指针变量,只是该变量保存的是函数的入口地址。

#include <iostream>

using namespace std;

int add(int x, int y)

{

return x+y;

}

int main()

{

// 函数指针

int (*p)(int,int)=NULL;

cout<<"sizeof(p) = "<<sizeof(p)<<endl;// 输出4

// 函数指针与函数入口建立关系

p=add;

// 通过函数指针调用函数

cout<<p(1,2)<<endl;//输出3

return 0;

}

4.2、函数指针变量的注意事项

1 函数指针变量不要加1操作,没有意义。

2 不要对函数指针变量取*,没有意义,编译器会自动优化。

3 函数指针变量判断大小也没有意义。

4 函数指针变量可以赋值,比如:p1=p2。

5 函数指针变量可以判断相等,比如:p1==p2。

4.3、函数指针变量使用typedef定义别名

#include <iostream>

using namespace std;

int add(int x, int y)

{

return x+y;

}

typedef int (*FUNC_NAME)(int,int);

int main()

{

// 函数指针

FUNC_NAME p =NULL;

cout<<"sizeof(p) = "<<sizeof(p)<<endl;// 输出4

// 函数指针与函数入口建立关系

p=add;

// 通过函数指针调用函数

cout<<p(1,2)<<endl;//输出3

return 0;

}

4.4、函数指针作为函数的参数

目的:让算法功能多样化,更加强大。

#include <iostream>

using namespace std;

int add(int x, int y)

{

return x+y;

}

int sub(int x, int y)

{

return x-y;

}

int mul(int x, int y)

{

return x*y;

}

int div(int x, int y)

{

return x/y;

}

int myCalc(int x,int y,int (*func)(int,int))

{

return func(x,y);

}

int main()

{

cout<<myCalc(20,30,add)<<endl;

cout<<myCalc(20,30,sub)<<endl;

cout<<myCalc(20,30,mul)<<endl;

cout<<myCalc(20,30,div)<<endl;

return 0;

}

五、总结

C++中指针和函数有着紧密的联系,指针可以用来存储函数的地址,通过指针调用函数或者将函数作为参数传递给其他函数。

相关推荐
草莓熊Lotso44 分钟前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
把我格子衫拿来7 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
无忧.芙桃8 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态
wuminyu10 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
xxwl58510 小时前
区域赛分类题解
c++·笔记·学习·算法
青少儿编程课堂10 小时前
蓝桥杯+全国青少年信息素养大赛+电子学会PythonC/C++考级:最长公共子序列LCS解析
c++·python·算法·bfs·信息学竞赛
代钦塔拉12 小时前
【C++/Qt 进阶】设计模式系列(2):工厂模式——从游戏角色到披萨店
c++·算法·设计模式
把我格子衫拿来13 小时前
VTK 与 Qt 的 CMake 工程怎么组织?模块、工具链与二进制兼容排错
c++·qt·vtk·cmake·工程实践
灯澜忆梦14 小时前
【面向对象编程c++】| 指针与自定义数据类型
开发语言·c++·算法
xxwl58514 小时前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法