原文: https://www.programiz.com/cpp-programming/pointers-function

在本文中,您将学习将指针作为函数的参数传递,并在程序中有效地使用它。

C++ 函数文章中,您了解了有关将参数传递给函数的知识。 因为传递了实际值,所以使用的此方法称为按值传递。

但是,还有另一种方法将参数传递给不传递参数实际值的函数。 而是仅传递对该值的引用。


示例 1:不使用指针传递引用

  1. #include <iostream>
  2. using namespace std;
  3. // Function prototype
  4. void swap(int&, int&);
  5. int main()
  6. {
  7. int a = 1, b = 2;
  8. cout << "Before swapping" << endl;
  9. cout << "a = " << a << endl;
  10. cout << "b = " << b << endl;
  11. swap(a, b);
  12. cout << "\nAfter swapping" << endl;
  13. cout << "a = " << a << endl;
  14. cout << "b = " << b << endl;
  15. return 0;
  16. }
  17. void swap(int& n1, int& n2) {
  18. int temp;
  19. temp = n1;
  20. n1 = n2;
  21. n2 = temp;
  22. }

输出

  1. Before swapping
  2. a = 1
  3. b = 2
  4. After swapping
  5. a = 2
  6. b = 1

main()中,定义了两个整数变量ab。 这些整数通过引用传递给函数swap()

编译器可以识别出此引用是通过引用传递的,因为函数定义为void swap(int& n1, int& n2)(请在数据类型后注意&符号)。

swap()函数中仅接收变量ab的引用(地址),并且在变量的原始地址中进行交换。

swap()函数中,n1n2是形式参数,实际上分别与变量ab相同。

还有另一种使用指针来完成相同任务的方法。


示例 2:使用指针传递引用

  1. #include <iostream>
  2. using namespace std;
  3. // Function prototype
  4. void swap(int*, int*);
  5. int main()
  6. {
  7. int a = 1, b = 2;
  8. cout << "Before swapping" << endl;
  9. cout << "a = " << a << endl;
  10. cout << "b = " << b << endl;
  11. swap(&a, &b);
  12. cout << "\nAfter swapping" << endl;
  13. cout << "a = " << a << endl;
  14. cout << "b = " << b << endl;
  15. return 0;
  16. }
  17. void swap(int* n1, int* n2) {
  18. int temp;
  19. temp = *n1;
  20. *n1 = *n2;
  21. *n2 = temp;
  22. }

此示例的输出与之前相同。

在这种情况下,变量的地址是在函数调用期间传递的,而不是变量本身。

  1. swap(&a, &b); // &a is address of a and &b is address of b

由于传递的是地址而不是值,因此必须使用解引用运算符来访问存储在该地址中的值。

  1. void swap(int* n1, int* n2) {
  2. ... .. ...
  3. }

*n1*n2分别给出存储在地址n1n2中的值。

由于n1包含a的地址,因此对*n1执行的任何操作也会更改main()函数中的a的值。 类似地,b将具有与*n2相同的值。