21xrx.com
2024-09-20 06:03:04 Friday
登录
文章检索 我的文章 写文章
值传递、引用传递、指针传递——函数参数传递机制详解
2023-07-11 16:45:39 深夜i     --     --
值传递 引用传递 指针传递 参数传递机制 函数参数

函数参数传递机制是程序员们日常工作中不可避免的话题,它涉及到很多底层的机制。在 C++ 中,参数传递方式有三种:值传递、引用传递和指针传递。下面我们就来详细讲解这三种传递方式的含义及其应用场景。

1. 值传递

值传递是指函数调用时,将实参的值复制一份到形参中,实际上是在栈中另开辟了一段空间,形参在栈中的存储位置与实参无关,它们互不影响。在函数内部,对形参的任何修改只影响形参本身,不会影响到实参的值。

对于接收基本数据类型的参数,我们通常使用值传递的方式,这样不仅能够保证代码的可读性,也能够避免一些在函数内部对实参进行修改所带来的代码错误。例如,以下代码就展示了一个简单的值传递的例子:


#include <iostream>

using namespace std;

void swap(int a, int b)

  int temp = a;

  a = b;

  b = temp;

int main() {

  int x = 10, y = 20;

  cout << "Before swap - x: " << x << ", y: " << y << endl;

  swap(x, y);

  cout << "After swap - x: " << x << ", y: " << y << endl;

  return 0;

}

以上代码调用了一个名为 `swap` 的函数,该函数使用了值传递方式,交换了两个整型变量的值,但输出的结果却仍为“10,20”,并未实现值的交换。 这是因为 `swap` 函数虽然改变了形参的值,但实参的值并没有发生改变。这充分说明了,当使用值传递方式传递参数时,函数内部修改形参的值不会影响到实参,即形参与实参是两个相互独立的变量。

2. 引用传递

引用传递是指在函数调用时,实参的地址被传递到形参中,形参在栈中开辟的空间被用来储存实参的地址,这样形参就成为了实参的一个别名,对形参的修改也会影响到实参的值。

引用传递在函数形参上加上一个”&“符号,例如:


void swap(int& a, int& b)

  int temp = a;

  a = b;

  b = temp;

通过引用传递方式,可以避免因大量数据拷贝而导致效率低下的情况。特别是当数据本身很大或复制起来很麻烦时,引用传递方式就显得尤为重要。例如,以下代码就展示了一个简单的引用传递的例子:


#include <iostream>

using namespace std;

void swap(int& a, int& b)

  int temp = a;

  a = b;

  b = temp;

int main() {

  int x = 10, y = 20;

  cout << "Before swap - x: " << x << ", y: " << y << endl;

  swap(x, y); //使用引用传递方式

  cout << "After swap - x: " << x << ", y: " << y << endl;

  return 0;

}

引用传递技术实质上就是拿指针去访问目标变量,但是它比指针更直观、更易用,而且它不需要特殊的语法和符号来表明操作的对象是指针而不是变量。

3. 指针传递

指针传递是指函数调用时,实参的指针被传递到形参中,形参在栈中开辟的空间被用来储存实参指针的地址,这样在函数内部就可以通过这个指针来修改实参的值。

与引用传递不同的是,指针传递需要使用特殊的语法符号”*“来表示指针变量,例如:


void swap(int* a, int* b) {

  int temp = *a;

  *a = *b;

  *b = temp;

}

常常使用指针传递技术来支持动态内存分配,而且还可以通过对指针的递增和递减来遍历数组,从而实现数组排序等操作。例如,以下代码展示了一个简单的指针传递的例子:


#include <iostream>

using namespace std;

void swap(int* a, int* b) {

  int temp = *a;

  *a = *b;

  *b = temp;

}

int main() {

  int x = 10, y = 20;

  cout << "Before swap - x: " << x << ", y: " << y << endl;

  swap(&x, &y); //使用指针传递方式

  cout << "After swap - x: " << x << ", y: " << y << endl;

  return 0;

}

总结

在编程中,我们经常需要在函数间传递参数,参数传递机制主要分为值传递、引用传递和指针传递这三种形式。值传递适用于数据量小的情况,而引用传递和指针传递适用于数据量较大或复杂情况下。

需要注意的是,使用参数传递时需要关注实参和形参的类型及其引用关系,另外也需要注意函数内部对实参是否进行了修改,以避免在程序运行中出现不必要的错误。 熟练运用这三种参数传递方式,对程序员们的日常工作及开发项目都有很大帮助。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复