c++将指针传递到函数中,用于将int数组从函数中传递出去并传递到函数

c++ passing Pointers into a function, for passing int arrays out of and into a function

本文关键字:函数 数组 int c++ 用于 指针      更新时间:2023-10-16

我正在尝试传递一个int数组。下面是我想做的一个例子。基本上,我可以写一个函数,通过返回指针来返回int数组。现在我想把这个函数作为另一个函数的参数。目标是让一个函数创建一个int数组,然后进入另一个将int数组作为输入的函数。它不起作用。在使用int*指针的函数中,int*指针只变为-8435432,并且在将其分配给另一个int*指针后无法读取其元素。我不明白。为什么我可以从一个函数中得到一个int数组,但它不能用作另一个函数的输入?

int * returnIntArray()
{
int * thePointer;
int j[3];
thePointer = j;
j[0] = 1;
j[1] = 3;
j[2] = -1;
return thePointer;
}
//
int * takesTheIntArray(int * anIntArray)
{
int x,y,z;
int * returnIt;
returnIt = anIntArray;
x = returnIt[0];
y = returnIt[1];
z = returnIt[3];
return returnIt;
}

int _tmain(int argc, _TCHAR* argv[])
{
int y,z,p;
int * x;
x = returnIntArray();
y = x[0];
z = x[1];
x = takesTheIntArray(returnIntArray());
cout << x[0] << ",  " << x[1];
//cout << theVector[1];
cout << "hello";
}
int * thePointer;
int j[3];
thePointer = j;

应为:

int* thePointer = new int[3];

第一个版本的问题是,您返回的是静态分配的(在堆栈上分配的)东西。当函数返回时,它将超出范围。在第二个版本中,它是动态分配的(在堆上分配)。完成后,请记住在指针上调用delete[](否则会泄漏内存)。

您可以重写returnIntArray()如下:

int * returnIntArray()
{
static int j[3];
j[0] = 1;
j[1] = 3;
j[2] = -1;
return j;
}

您不需要只隐藏j是在作用域末尾销毁的局部变量这一事实的"指针"变量。您可能尝试不使用"Pointer"变量,并获得"警告C4172:返回本地变量或临时地址",这意味着返回后返回的值将无效(与Pointer存在的问题相同)。静态before j声明使j成为全局的(但只能通过其在函数中的名称获得),因此j包含的值不会在作用域末尾丢失。

我不明白"takesIntArray"的目的是什么——也许是为了在调试器中查看x、y、z值?如果是这种情况,您不需要复制指针,只需执行以下操作即可:

//
int * takesTheIntArray(int * anIntArray)
{
int x,y,z;
x = anIntArray[0];
y = anIntArray[1];
z = anIntArray[2];
return anIntArray;
}

保留你的主菜单,这应该可以随心所欲:)[edit]我在转发时没有注意到"takesIntArray"中有一个拼写错误:z var的anIntArray索引应该是2,而不是3[/edit]