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