从函数中改变数组元素的值

时间:2012-11-08 18:03:23

标签: c++ arrays

我是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;
}

我认为带有注释的代码解释了问题所在,但是这里有更多信息: 有4个函数,分别是someFunction,someFunction2,someFunction3,someFunction4。 有一个数组y,其值为0,1,2。 所有函数都会更改原始数组的值。也就是说,someFunctionX调用之后main函数中的y元素比调用函数之前更改。

我的问题是:为什么someFunction4是唯一不改变值的函数?

提前谢谢。抱歉我的英语不好。

4 个答案:

答案 0 :(得分:7)

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); 

答案 1 :(得分:5)

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

x[1] = 1;

它实际上会影响ymain()指向的相同内存!

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

x = new int[n];

因此它不再指向ymain()执行的相同内存,以及之后对其所做的任何更改(但仅限于someFunction4范围内!)将不会影响y

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

当你调用SomeFunctionN(y,3)然后在SomeFunctionN里面,'x'变量是一个局部变量,被初始化为指向y指向main的同一个数组。

然后在SomeFunc4中

创建一个新数组,并将本地指针(x)更改为指向新数组。您所做的所有更改都会触及新数组

在所有其他情况下,你只留下x