C++指针作为函数参数(附带实例)
在 C++ 中,指针因其在访问内存上的灵活性而出名,而函数的任务是读写并处理内存中的数据。当指针与函数搭配使用时,可以大大提高函数读写数据的灵活性,增加函数的功能。
指针在函数中的应用主要包括两个方面,分别是指针作为函数参数和指针作为函数的返回值,本节主要讲解指针作为函数参数的情况。
在大多数情况下,函数之间参数的传递是通过“传值”的方式来完成的。参数的传值传递需要对参数数据进行拷贝。如果要传递的数据较大,例如要向函数传递一个数组或者一个大体积的对象,参数的拷贝过程会耗费较多时间,从而降低了函数的性能。
在这种情况下,利用指针可以访问它所指向的数据,将指向这些大体积参数数据的指针作为函数参数,可以很好地解决这个问题。
在函数内部,通过作为参数传递进来的指针,我们可以间接地访问函数外部原本需要传递的大体积参数数据。这样,我们用一个 4 字节的指针代替了传递成千上万字节的大体积数据,实现了同样的数据传递效果,避免了大体积数据的拷贝过程,从而提高了函数的性能。
使用指针作为函数参数,不仅可以向函数传入数据,还可以将数据传回函数的调用者。换句话说,就是通过指向外部参数数据的指针,我们可以在函数内部读取外部的数据,相当于实现了数据向函数内的传递。同时,也可以在函数内部修改这些数据,相当于把函数处理后的数据结果传回了调用者。
下面是一个使用指针作为函数参数的示例:
在完成统计后,pSum 指针可以将计算结果直接保存到它所指向的变量 nArraySum 中(函数外用于保存计算结果的变量),实现数据的传出。
利用指针作为函数参数传递数据的本质在于,在主调函数和被调函数中,通过访问指向同一内存地址的不同指针来访问相同的内存区域,从而实现数据的传递和交换。下图展示了指针作为函数参数访问相同内存区域的过程。

图 1 指针作为函数参数访问相同的内存区域
指针在函数中的应用主要包括两个方面,分别是指针作为函数参数和指针作为函数的返回值,本节主要讲解指针作为函数参数的情况。
在大多数情况下,函数之间参数的传递是通过“传值”的方式来完成的。参数的传值传递需要对参数数据进行拷贝。如果要传递的数据较大,例如要向函数传递一个数组或者一个大体积的对象,参数的拷贝过程会耗费较多时间,从而降低了函数的性能。
在这种情况下,利用指针可以访问它所指向的数据,将指向这些大体积参数数据的指针作为函数参数,可以很好地解决这个问题。
在函数内部,通过作为参数传递进来的指针,我们可以间接地访问函数外部原本需要传递的大体积参数数据。这样,我们用一个 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 指针作为函数参数访问相同的内存区域