我有一个用于在C ++中初始化数组的函数。初始化后,main无法访问数组中的数据。不知道为什么。有什么帮助吗?
void testArray(int *listPtr)
{
listPtr=new int[2];
listPtr[0]=0;
listPtr[1]=1;
}// end testArray
void main()
{
int *list;
testArray(list);
cout<<list[0]<<list[1]<<endl; // this gives some random output
} // end main
答案 0 :(得分:5)
您需要通过引用传递 ,以便可以将指针listPtr
本身的更改传递给outter变量。请记住,您正在更改“指针本身”的值,如果通过 传递 ,则对调用者不可见。
void testArray(int * &listPtr)
{
listPtr=new int[2];
listPtr[0]=0;
listPtr[1]=1;
}// end testArray
答案 1 :(得分:5)
这是因为指针是按值传递的。复制函数的参数,函数的第一行用新表达式的结果替换指针的本地副本。返回main()
的指针的原始副本不受此影响。
你可以通过引用传递指针来“修复”这个:
void testArray(int*& listPtr)
{
listPtr = new int[2];
// ...
}
int main()
{
int* list = 0;
testArray(list);
// ...
delete list;
return 0;
}
或通过将指针传递给指针:
void testArray(int** listPtr)
{
*listPtr = new int[2];
// ...
}
int main()
{
int* list = 0;
testArray(&list);
// ...
delete list;
return 0;
}
或更好的是,通过使用提供值语义的C ++标准库容器(与引用参数一起使用):
void testVec(std::vector<int>& list)
{
list.resize(2);
list[0] = 0;
list[1] = 1;
}
int main()
{
std::vector<int> list;
testVec(list);
// ...
return 0;
}
问题出现是因为指针是指向某个其他对象的独立实体(对象)。指针可以像常规对象一样被复制,并且没有特别考虑它们以确保它们指向的东西被更新以反映对指针所做的任何改变。参考完全是一个不同的野兽。一旦引用绑定到某个对象,它(与所有意图和目的)无法区分对象本身;对引用的任何操作都是对底层对象的操作。你可以把它想象成你拥有一只名叫Fluffy的猫,你让你的朋友借Fluffy;但你的朋友叫她巴菲。它是同一只猫,如果你的朋友修剪她的爪子,下次你看到蓬松时,她会修剪爪子。
对于指针示例,你有Fluffy,你给你的朋友一张注有Fluffy地址的便条。你的朋友去找一只新猫,并在你给他们的便条上写下新猫的地址。现在,当你的朋友修剪新猫的爪子时,Fluffy一无所获。这张纸条让你的朋友去了蓬松生活的地方;直到您的朋友用其他猫的地址覆盖该笔记的那一点。
引用使得更容易推理代码的行为,并且在几乎所有情况下都应该是首选。
答案 2 :(得分:1)
您需要使用传递引用,以便在testarray函数中初始化时更新listPtr。
要做到这一点,请执行以下操作 -
void testArray(int * &listPtr)
{
listPtr=new int[2];
listPtr[0]=0;
listPtr[1]=1;
}
如果您对上述解决方案感到困惑,您可以简单地全局声明并初始化此解决方案。