C++ 按地址传递

17 Mar 2025 | 4 分钟阅读

地址调用 (Call By Address) 也被称为指针调用 (Call By Pointers)。在这种地址调用方法中,开发者将实际参数的地址传递给形式参数。之后,函数利用这些地址来访问系统中的实际参数。换句话说,当使用地址调用/地址传递 (Call by address/Pass by address) 技术时,函数参数是以地址的形式传递的。调用函数传递参数的地址。在函数定义中会使用指针变量。借助地址调用机制,函数可以访问并修改实际参数。在本教程的后续部分,我们将看到一个地址调用方法的示例。

地址调用示例

让我们通过一个例子来说明 C++ 中的地址调用 (Call by Address)

输出

Value of t inside main() = 5

In the cba() function : 
Value of *j = 5
Value of *j = 10

Value of t inside main() = 10

说明

在这个例子中,我们将演示地址调用 (Call by address) 机制。我们调用 "cba()" 函数,并从 "main()" 函数中传递 "t" 的地址。在函数定义中,我们将 "t" 的地址赋给一个指针变量,即 "j"。在 hello 函数内部,使用该指针将 "t" 的值修改为 10。因此,在调用 "cba()" 函数之后,"main()" 函数内部 "t" 的值被设置为 10。

示例 2

让我们再举一个例子来说明 C++ 中的地址调用 (Call by Address)

输出

Call by address in C++

说明

在这个例子中,我们将演示如何将地址调用方法应用于一个实际问题。例如,我们希望创建一个交换两个变量的函数。如果我们使用值调用 (Call by value) 的方法交换两个变量,实际变量在调用函数中不会改变。在这种情况下,可以使用地址调用方法。在这个例子中,我们将 v1 (&v1)v2 (&v2) 的地址都传递给 "mySwap()" 函数。在 "mySwap()" 函数内部,我们使用指针来交换这两个变量的值。正如我们在下面的输出中所见,在调用了 "mySwap()" 函数之后,这些变量的实际值在 "main()" 方法中被交换了。

C++ 中地址调用的优点

C++ 中的地址调用有几个优点。地址调用的一些主要优点如下

  1. 效率: 当处理大型数据结构(如对象或数组)时,通过引用或指针传递比通过值传递更有效率。它不需要创建数据的副本,从而减少了额外开销。
  2. 修改原始数据: 当我们通过引用或指针传递参数时,在函数内部对参数所做的任何修改都会直接影响到原始数据。当我们想在函数内部修改原始数据时,这非常有用。
  3. 避免“对象切片”: 在处理多态和继承时,按值传递对象可能会导致“对象切片” (object slicing),即只有对象的基类部分被复制,从而丢失了派生类特有的数据。通过引用或指针传递对象可以避免这个问题。
  4. 灵活性: 引用和指针使得函数参数可以更加自由地定制。使用指针或引用,我们可以将多种类型的对象和数据结构传递给同一个函数。
  5. 传递空值或可选值: 在某些编程情况下,指针可以被设置为 nullptr 或用作可选参数,以表示值的缺失。
  6. 多个返回值: 通过修改所引用或指向的值,指针和引用可以用来从一个函数返回多个值。

然而,务必谨慎处理引用和指针,因为如果管理不当,它们可能会导致空指针解引用、内存泄漏和不必要的副作用等问题。在 C++ 中选择使用引用调用 (Call by reference) 还是值调用 (call by value) 时,我们应该始终考虑代码的设计和安全性。


下一个主题C++ 中的 Chrono