首页 > 编程笔记 > C++笔记 阅读:19

C++指针作为函数参数(附带实例)

C++ 中,指针因其在访问内存上的灵活性而出名,而函数的任务是读写并处理内存中的数据。当指针与函数搭配使用时,可以大大提高函数读写数据的灵活性,增加函数的功能。

指针在函数中的应用主要包括两个方面,分别是指针作为函数参数和指针作为函数的返回值,本节主要讲解指针作为函数参数的情况。

在大多数情况下,函数之间参数的传递是通过“传值”的方式来完成的。参数的传值传递需要对参数数据进行拷贝。如果要传递的数据较大,例如要向函数传递一个数组或者一个大体积的对象,参数的拷贝过程会耗费较多时间,从而降低了函数的性能。

在这种情况下,利用指针可以访问它所指向的数据,将指向这些大体积参数数据的指针作为函数参数,可以很好地解决这个问题。

在函数内部,通过作为参数传递进来的指针,我们可以间接地访问函数外部原本需要传递的大体积参数数据。这样,我们用一个 4 字节的指针代替了传递成千上万字节的大体积数据,实现了同样的数据传递效果,避免了大体积数据的拷贝过程,从而提高了函数的性能。

使用指针作为函数参数,不仅可以向函数传入数据,还可以将数据传回函数的调用者。换句话说,就是通过指向外部参数数据的指针,我们可以在函数内部读取外部的数据,相当于实现了数据向函数内的传递。同时,也可以在函数内部修改这些数据,相当于把函数处理后的数据结果传回了调用者。

下面是一个使用指针作为函数参数的示例:
#include <iostream>
using namespace std;

// 计算数组中所有数据之和
// 其中,参数 pArray 和 nCount 分别表示数组的首地址和数组元素的个数
// 用于向函数传入一个数组
// pSum 指向用于保存计算结果的变量,用于从函数中传出计算结果
void SumArray(int* pArray, int nCount, int* pSum)
{
    // 参数有效性检查
    int nRes = 0;  // 用于存储计算结果的变量
    // 循环遍历整个数组,计算所有数据之和
    for ( int i = 0; i < nCount; ++i )
    {
        // 通过 pArray 指针访问它所指向的函数外的 nArray 数组
        // 读取其中的数据并累加到 nRes 中,实现向函数内传入数据
        nRes += *pArray;
        pArray++;  // 指针加运算,访问数组中的下一个元素
    }
    // 通过 pSum 指针访问它所指向的函数外的 nArraySum 变量
    // 将结果数据写入这个变量,实现向函数外传出数据
    *pSum = nRes;
}

int main()
{
    // 保存计算数据的变量
    int nArraySum = 0;
    // 需要统计的数组
    int nArray[5] = { 1, 2, 3, 4, 5 };

    // 使用数组的首地址 nArray 传入数组
    // 使用指向变量 nArraySum 的指针来接收计算结果
    SumArray(nArray, 5, &nArraySum);

    // 计算结果已经保存在 nArraySum 中,直接输出计算结果
    cout << "数组中所有数据之和是:" << nArraySum << endl;

    return 0;
}
输出结果为:

数组中所有数据之和是:15

在主函数中,我们将数组 nArray 的首地址和指向保存计算结果的变量 nArraySum 的地址作为实际参数传递给数组求和函数 SumArray()。在 SumArray() 函数中,就可以通过传入的数组首地址访问整个数组,从而实现数据的传入。

在完成统计后,pSum 指针可以将计算结果直接保存到它所指向的变量 nArraySum 中(函数外用于保存计算结果的变量),实现数据的传出。

利用指针作为函数参数传递数据的本质在于,在主调函数和被调函数中,通过访问指向同一内存地址的不同指针来访问相同的内存区域,从而实现数据的传递和交换。下图展示了指针作为函数参数访问相同内存区域的过程。


图 1 指针作为函数参数访问相同的内存区域

相关文章