16

我是 C++ 新手(每个新手 XD 的常规介绍),我发现了这种意外行为。我跟踪了程序中的变量和数组,直到确定了这种模式:

#include <iostream>

using namespace std;

void showArray(int arr[], int n)
{
    for(int i = 0; i < n; i++) cout << arr[i] << " ";
    cout << endl;
}
void someFunction(int x[], int n) // changes the original values
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
} 
void someFunction2(int * x, int n)
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
} // changes the original values
int someFunction3(int x[], int n)
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
    return 0;
} // changes the original values
int someFunction4(int x[], int n)
{
    x = new int[n];
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
    return 0;
} // does NOT change the original value

int main(void)
{
    int * y = new int[3];
    y[0] = 0;
    y[1] = 1;
    y[2] = 2;
    showArray(y, 3);
    someFunction4(y, 3);
    showArray(y, 3);
    return 0;
}

为什么不someFunction4()改变y数组main()?当我改为调用另一个someFunctionX()时,成功地从 更改为。main()y{0, 1, 2}{2, 1, 0}

4

4 回答 4

10

someFunction4中,您分配x指向一个new整数数组,然后分配该数组。您传递给函数的变量指向的数组仍然指向旧数组。旧数组保持不变,因为someFunction4您已设置x引用不同的数组,即您在函数中通过new.

为了使原件x保持someFunction4()您分配的值,请执行以下两项操作之一:

1)摆脱x = new int[n];。这将使someFunction4()工作像以前的一样。

2) 将指针x作为参数传递给someFunction4()someFunction4()获取指针。

int someFunction4(int *x[], int n)
{
    *x = new int[n];
    (*x)[0] = 2;
    (*x)[1] = 1;
    (*x)[2] = 0;
    return 0;
} // Makes x point to a new a new array

在你的主要,做

someFunction4(&y,3); 
于 2012-11-08T18:10:35.540 回答
5

在每个someFunctionsomeFunction2someFunction3中,您实际上是在传递一个指针,指向您为数组分配的内存main()。这意味着当您对数据进行操作时,此指针指向:

x[1] = 1;

它实际上会影响y指向 back in的相同内存main()

但是,在 中someFunction4,您使用以下语句重新分配指针x以指向新内存:

x = new int[n];

因此,它不再指向与 in 相同的内存,y之后main()您对其所做的任何更改(但仅在someFunction4! 的范围内)都不会影响y.

于 2012-11-08T18:13:53.637 回答
2

我做了一个测试用例。

http://ideone.com/fyl6MX

结果

0 1 2 
0x943b008
0x943b018
0x943b008
0 1 2 

第二个是地址是新表的地址。如您所见,您的指针在本地指向其他地址。

#include <iostream>

using namespace std;

void showArray(int arr[], int n)
{
    for(int i = 0; i < n; i++) cout << arr[i] << " ";
    cout << endl;
}
void someFunction(int x[], int n) // changes the original values
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
} 
void someFunction2(int * x, int n)
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
} // changes the original values
int someFunction3(int x[], int n)
{
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
    return 0;
} // changes the original values
int someFunction4(int x[], int n)
{
    x = new int[n];
    std::cout << x << endl;
    x[0] = 2;
    x[1] = 1;
    x[2] = 0;
    return 0;
} // does NOT change the original value

int main(void)
{
    int * y = new int[3];
    y[0] = 0;
    y[1] = 1;
    y[2] = 2;
    showArray(y, 3);

    std::cout << y  << endl;

    someFunction4(y, 3) ;
    std::cout << y << endl;

    showArray(y, 3);
    return 0;
}
于 2012-11-08T18:12:20.890 回答
0

您必须了解参数如何传递给函数

当您调用 SomeFunctionN(y,3) 时,在 SomeFunctionN 中,“x”变量是一个局部变量,初始化为指向 y 在 main 中指向的同一个数组。

然后在 SomeFunc4 中创建一个新数组并将本地指针 (x) 更改为指向新数组。您所做的所有更改都会命中新数组

在所有其他情况下,您不要理会 x

于 2012-11-08T18:10:37.740 回答