为什么在函数中修改指针?

Why are pointers modified in a function ?

作为 C++ 的初学者,我遇到函数的第一件事是它们使用参数的副本,例如,如果我们执行此操作:

void add (double x){
  x=x+3;
}

int main(){
double x=2 ; 
add(x) ;
}

那么x实际上等于2,而不是5。后来学习指针,发现如下:

void fill (int *t){
  for (int j=0, j<10, j++){
  t[j]=j;
}

int main(){
int* p;
p = new int[10];
fill(p);
}

现在如果我们打印 p 包含的内容,我们会发现它确实由整数填充。我很难理解为什么它会这样做,因为我觉得它应该与第一个功能相同?

谢谢。

在第一个示例中,您使用的是普通变量。像这样将普通变量传递给函数时,函数会创建自己的变量副本(它的值与传递它时的值相同,但它被复制到内存中的不同位置)。这是标准行为。

在第二个示例中,您使用的是指针:我们可以说它指向内存中存储值的位置。它们的一些优点:

1) 如果您想节省内存,但需要在不同的函数中使用相同的值 -> 主要适用于比 double 更大的对象,例如示例中的数组

2) 如果需要在不同的函数中改变variable/array/object的值

但要小心,在第二个函数中你仍然创建了副本,但不是值,而是指针。所以基本上,"new" 指针是不同的对象,但它指向内存中的同一个地方,所以当访问值时(你正在使用 [j]),你正在编辑内存中的同一个地方。

这不是那么容易掌握的概念,尤其是对于更多维数组,但希望这对您有所帮助。您可以在教程或 C++ 文档中了解更多信息,例如,这是一个很好的文档:https://www.geeksforgeeks.org/pointers-in-c-and-c-set-1-introduction-arithmetic-and-array/

它与第一个函数不同的原因是因为您按值传递 指针。这意味着如果您修改实际指针,例如通过分配给它,那么它只会在函数内部处于该状态。指针 指向 的值仍然是原始值,它将被修改,因为两个复制的指针都指向相同的原始值(不要忘记形式的符号 a[i] 等同于 *(a + i),它执行取消引用并修改指向的值,而不是指针本身)。

下面是一个说明这一点的小例子(不考虑内存泄漏):

#include <iostream>

int test(int* x)
{
    int* y = new int{10};
    x = y;
    std::cout << "Inside function: " << *x << "\n";
}

int main()
{
    int* t = new int{5};
    std::cout << "Before function: " << *t << "\n";
    test(t);
    std::cout << "After function: " << *t << "\n";
}