指针在函数参数中的应用
我们在上一篇文章有提到过,C++需要指针来操纵内存地址来管理数据,那么我们在函数中是如何使用指针来改变实参的值呢?
如果我们相求两个数a和b的和和积,那么我们先试着用最简单的形式写一下看看:
#include <iostream>
using namespace std;
//--- 把 x 与 y 的和与积赋给 *sum 与 *mul ---
void sum_mul(int x, int y, int sum, int mul)
{
sum = x + y; // 把 x 与 y 的和赋给 sum
mul = x * y; // 把 x 与 y 的积赋给 mul
}
int main()
{
int a, b;
int he = 0, ji = 0;
cout << "整数 a:"; cin >> a;
cout << "整数 b:"; cin >> b;
sum_mul(a, b, he, ji); // 计算 a 与 b 的和与积
cout << "和为 " << he << "。" << endl;
cout << "积为 " << ji << "。" << endl;
}
在这个例子中,函数参数是按值传递的,这意味着函数内部对参数的修改不会影响到主函数中的变量。如果主函数中调用 sum_mul (a, b, he, ji),那么 sum 和 mul 只是 he 和 ji 的副本,函数内部对它们的修改不会改变主函数中的 he 和 ji。因此,这个函数无法正确实现预期功能。
如果我们使用指针来做实现这个功能呢?
#include <iostream>
using namespace std;
//--- 把 x 与 y 的和与积赋给 *sum 与 *mul ---
void sum_mul(int x, int y, int* sum, int* mul)
{
*sum = x + y; // 把 x 与 y 的和赋给 *sum
*mul = x * y; // 把 x 与 y 的积赋给 *mul
}
int main()
{
int a, b;
int he = 0, ji = 0;
cout << "整数 a:"; cin >> a;
cout << "整数 b:"; cin >> b;
sum_mul(a, b, &he, &ji); // 计算 a 与 b 的和与积
cout << "和为 " << he << "。" << endl;
cout << "积为 " << ji << "。" << endl;
}
通过解引用操作符(指针符号) *,可以访问指针指向的内存地址中的值。例如,*sum = x + y 表示将 x + y 的结果存储到 sum 指向的内存地址中。主函数调用的时候,用 sum_mul(a, b, &he, &ji) 时,&he 和 &ji 分别是变量 he 和 ji 的内存地址。
函数内部通过指针修改了这些内存地址中的值,因此主函数中的 he 和 ji 会被正确更新。
我们看一下这里函数的参数是怎样传递的?
在这里注意看绿色框中的数据,我们传递的是变量he和ji的地址212和216,而不he和ji的值。
为什么使用指针?
当需要通过函数修改主函数变量的值的时候,指针是常用的方法。指针允许函数直接修改主函数中的变量,而不需要返回值。