c++ - 为什么基于指针交换两个值在函数范围之外不起作用?

标签 c++ pointers swap

我已经很多年没有用 C++ 编程了,所以我决定重温一下指针的内存。

经典的两个数交换的例子,例子是

void swapPointersClassic(double *num1, double *num2) 
{
  double temp;
  temp = *num1;
  *num1 = *num2;
  *num2 = temp;
}

这允许我们像 swapPointersClassic(&foo, &bar); 一样调用函数,因为我们传入了变量 foo 和 bar 的内存地址,函数将检索值并进行交换.但我开始怀疑,为什么我不能执行以下操作?

void swapPointers(double *num1, double *num2)
{
  double *temp;
  temp = num1;
  num1 = num2;
  num2 = temp;
}

这对我来说似乎更有意义,因为我们只需要创建足够的临时存储来存储内存地址 num1(而不是用于存储 double 值 *num1 的完整临时存储)。但是,函数范围似乎限制了指针交换的效果。调用 swapPointers(&foo, &bar); 后,我可以看到在函数 swapPointers 中,foo 和 bar 确实被交换了。一旦我们退出 swapPointers 函数,foo 和 bar 就不再交换。谁能帮我理解为什么会这样?这种行为让我想起了典型的按值传递方法,但我们在这里传递的是指针。那么这意味着我们只能触摸这些指针指向的值,而不能触摸指针本身?

最佳答案

事实上你并不是真的通过指针传递。您按值传递两个指针。传递指针本身是不够的——你必须取消引用它们。取消引用指针(的拷贝)的行为使魔法发生,这是实现范围遍历的实际位置。

修改函数的参数是函数局部的,即使参数本身是指针。您必须取消引用它们才能访问它们指向的内存(同样,“通过指针传递”不仅仅是传递指针 - 它是传递指针正确使用它们) .

此外,请考虑以下事项。如果您的第二种方法奏效,并且交换了两个指针,则意味着交换了变量的地址。这没有多大意义。

顺便说一下,在 C++ 中我们有一个真正的按引用传递调用约定,所以有 不需要弄乱指针:

void swap(double &a, double &b)
{
    double temp = a;
    a = b;
    b = temp;
}

float a = 1, b = 2;
swap(a, b);

(这只是一个实现问题,编译器很可能会通过实际使用指针来实现这种行为,但至少你不会头疼。)

关于c++ - 为什么基于指针交换两个值在函数范围之外不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13294823/

相关文章:

python-3.x - 如何在 Python 中重新排列字节数组中的字节?

c++ - 在 C 模块中声明一个 vector 变量导致段错误

C++ 从 ‘const type* const’ 到 ‘type*’ 的无效转换

C++ 简单华氏转换

c - 从二进制文件读取二维数组并返回该数组的指针(在C中)

c - 使用 C 中的函数和指针将 n 个数组合并为一个

c - 结构和 union :从性能的角度来看哪个更好?通过值或指针传递参数?

java - 交换 2 个特定的 JButton

c++ - 正则表达式 : C++ extract text within double quotes

algorithm - 通过后备数组中的索引交换双向链表中的项目