与简单变量一样,指针变量也可以用作函数中的Value参数或Reference参数。。。。。但当指针变量被用作2保存内存位置或内存位置的内容时,如果指针变量用作Value或Reference参数,会有什么不同????
如果函数A通过引用另一个函数B来传递指针p,那么B可以使p指向内存中的不同位置,而A将看到这种变化。另一方面,如果A按值传递P,则B只能更改P指向的内存的内容。A将看到该内存的更改,但当B返回时,P永远不会指向内存中的不同点。
差异如下:
- 如果按值传递指针,则调用者将看不到被调用者对指针所做的任何更改
- 如果通过引用传递指针,则被调用者对指针所做的任何更改都将对调用者可见
在这里,我谈论的是指针本身的值(即它指向的位置),而不是指向对象的值。
这个小例子说明了通过引用传递指针的必要性
//pass by value
void InitString1( char* buf )
{
buf = new char[5];
}
//pass by reference
void InitString2( char*& buf )
{
buf = new char[5];
}
int main()
{
char* buffer = 0;
InitString1( buffer);
//buffer is still null and memory leaks
delete [] buffer;
InitString2( buffer );
//buffer will be assigned correctly
delete [] buffer;
return 0;
}
#include <iostream>
void passByValue(int* p) {
p = new int;
}
void passByReference(int*& p) {
p = new int;
}
int main() {
int *p1 = 0;
int *p2 = 0;
passByValue(p1);
passByReference(p2);
std::cout << p1 << "n";
std::cout << p2 << "n";
}
请考虑上面的程序。第一行将始终打印零,这意味着main
的p1
变量是,而不是由对passByValue
的调用更新的。相反,p2
是通过调用passByRefernce
来更新的。