gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:34:40 25 4
gpt4 key购买 nike

我已经很多年没有用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com