我是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是唯一不改变值的函数?
提前谢谢。抱歉我的英语不好。答案 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)
在someFunction
,someFunction2
和someFunction3
的每一个中,您实际上是将pointer传递给main()
中为数组分配的内存。这意味着当您对数据进行操作时,该指针指向:
x[1] = 1;
它实际上会影响y
中main()
指向的相同内存!
但是,在someFunction4
中,您重新分配指针x
以指向具有以下语句的新内存:
x = new int[n];
因此它不再指向y
中main()
执行的相同内存,以及之后对其所做的任何更改(但仅限于someFunction4
范围内!)将不会影响y
。
答案 2 :(得分:2)
我做了一个测试用例。
结果
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