c++中的指针按值/引用传递

Pointers in c++ pass by value/reference

本文关键字:引用 指针 c++      更新时间:2023-10-16

与简单变量一样,指针变量也可以用作函数中的Value参数或Reference参数。。。。。但当指针变量被用作2保存内存位置或内存位置的内容时,如果指针变量用作Value或Reference参数,会有什么不同????

如果函数A通过引用另一个函数B来传递指针p,那么B可以使p指向内存中的不同位置,而A将看到这种变化。另一方面,如果A按值传递P,则B只能更改P指向的内存的内容。A将看到该内存的更改,但当B返回时,P永远不会指向内存中的不同点。

差异如下:

  1. 如果按值传递指针,则调用者将看不到被调用者对指针所做的任何更改
  2. 如果通过引用传递指针,则被调用者对指针所做的任何更改都将对调用者可见

在这里,我谈论的是指针本身的值(即它指向的位置),而不是指向对象的值。

这个小例子说明了通过引用传递指针的必要性

//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";
}

请考虑上面的程序。第一行将始终打印零,这意味着mainp1变量是,而不是由对passByValue的调用更新的。相反,p2是通过调用passByRefernce来更新的。