假设我有一个“A”级和这个功能:
void initializationFunction(A* classPointer)
{
...
...
classPointer = new A(.....);
}
我写道:
A* classPointer;
然后我把这个指针传递给这个函数:
initializationFunction(classPointer);
除非我在函数声明中通过引用传递它,否则这将不起作用:
void initializationFunction(A*& classPointer);
我认为引用传递是针对非指针类型的变量。我的意思是你不需要通过引用传递一个数组......
感谢您的解释:)
答案 0 :(得分:5)
A**
)。
但最好的解决方案是以这样的方式编写A
的构造函数,这样你就不需要这个函数了。也就是说,无论你在这个函数中做什么,你都应该在构造函数本身中这样做。
但是,如果您无法编辑课程,则可以改为:
A *initializationFunction()
{
A *obj = new A(.....);
//...
return obj;
}
A *classPointer = initializationFunction();
在我看来,这种方法比你的方法更好。
注意我没有更改函数名和其他变量。我想这不是帖子的重点。但我相信你会想要更好的真实代码名称。
答案 1 :(得分:1)
您可以通过引用传递任何变量。传递引用和传递值之间的区别在于,当您通过引用传递时,实际上是传递指向该内存位置中的值的相同指针,并且当您传递值时,您只是传递另一个引用该内存位置,因此您分配给它的任何内容都将 NOT 更改传递的参数值。
答案 2 :(得分:1)
使用双指针(a **)或引用。
答案 3 :(得分:1)
要么使用引用声明,要么使用以下引用:
void initializationFunction(A** classPointer);
关键是你传入一个指针参数,并且你想修改它在调用者中的值。这是一个 out 参数,out参数应该通过引用传递,而不是通过值传递(这里的引用意味着通过指针或引用)。这个out参数是一个指针,所以你应该传递一个指向该指针的指针或对该指针的引用。
换句话说,您需要访问调用程序堆栈中的原始参数才能对其进行修改。在声明中
void initializationFunction(A* classPointer);
classPointer
类似于initializationFunction
中定义的局部变量,它只是您在调用函数中分配的classPointer
的副本。修改classPointer
的副本不会修改原始变量,因此您需要一个指向原始变量的指针才能对其进行修改。如果您使用对原始classPointer
的引用,也是如此。
另一种方法是从函数中返回新的classPointer
:
A* initializationFunction(void);
在这种情况下,来电者只会这样做:
A* classPointer = initializationFunction();
答案 4 :(得分:1)
在第一个示例中,指针按值传递(即函数获取指针的副本)。指针指向的对象当然在调用代码和函数内部都是相同的。
在第二个例子中,指针通过引用传递(即函数基本上使用与调用代码相同的指针)。
答案 5 :(得分:1)
说你有一个指向“我的文档”中文本文件的Windows快捷方式。
您可以复制该快捷方式并将其粘贴到窗口中的任意位置,双击它,然后在“我的文档”中打开文本文件。那是通过引用/指针传递的。快捷方式指向“where”,然后用它来改变“stuff”。
但是,您发布的代码不会“打开”快捷方式指向的文件。它实际上更改了指向(实际创建)新“文件”的快捷方式。但由于快捷方式本身首先被复制(通过值传递),因此效果是您分配了内存但无法访问它。所以类似地你更改了快捷方式,创建了一个“文件”,但随后删除了那个快捷方式的目录(但是你的文件在外层空间丢失了!)。
不幸的是,实际上没有通过引用传递快捷方式的类比,你基本上必须将快捷方式复制回目录,然后将“我的文档”中的原始文本文件替换为这个新的快捷方式。文件”。希望这有助于而不是进一步混淆:(。
答案 6 :(得分:0)
应该是:
void initializationFunction(A** classPointer)
{
...
...
*classPointer = new A(.....);
}
呼叫:
initializationFunction(&ptr);
该函数将传递的参数设置为new A(......);
答案 7 :(得分:0)
你必须通过引用传递指针的原因是你实际上正在改变内存所指向的位置。如果您已经将它分配给一个对象并想要修改该对象,那么直接将它传递给该函数就可以了。
当你执行Aptr = new A(...)
时,你就是
- 在堆上的某处创建'A'对象
- 将新创建的对象的地址分配给Aptr
如果该函数没有Aptr
的引用,则该函数无法更改其值。
答案 8 :(得分:0)
您可以通过引用传递指针,因为指针也是具有自己地址的变量。
例如,在32位体系结构中,您可以声明unsigned int
并将其用作指针。
答案 9 :(得分:0)
这很正常。
我解释说:
void foo(X* toto)
{
toto=new X();
}
toto值将从调用堆栈中以其初始值(与任何其他参数,指针或不符号)一起输出 因为它不可能改变函数参数值,所以它是一个参考。
这样:
void foo(X*& toto)
{
toto=new X();
}
这里你明确地说toto参数为X *& (X *代表类型,&(引用)让它的值在函数foo中修改)
指针类型与任何其他类型相同。用int替换X *,你会立即发现除非作为参考传递,否则不会在函数调用之外更改toto。
使用这样的实现,X **也可以做到这一点:
void foo(X** toto)
{
*toto=new X();
}