Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的指针+;传递值/引用_C++_Pointers - Fatal编程技术网

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

C++ c+中的指针+;传递值/引用,c++,pointers,C++,Pointers,与简单变量一样,指针变量也可以用作函数中的值参数或引用参数。。。。。但是,由于指针变量用于保存内存位置或内存位置的内容,那么如果指针变量用作值或引用参数,会有什么区别呢???如果函数A通过引用另一个函数B传递指针p,那么B可以使p指向内存中的不同位置,A将看到这种变化。另一方面,如果A通过值传递P,那么B只能更改P指向的内存的内容。A将看到该内存的更改,但当B返回时,P将永远不会指向内存中的其他位置。差异如下: 如果按值传递指针,则被调用方对指针所做的任何更改都不会对调用方可见 如果通过引用传递

与简单变量一样,指针变量也可以用作函数中的值参数或引用参数。。。。。但是,由于指针变量用于保存内存位置或内存位置的内容,那么如果指针变量用作值或引用参数,会有什么区别呢???

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

差异如下:

  • 如果按值传递指针,则被调用方对指针所做的任何更改都不会对调用方可见
  • 如果通过引用传递指针,则被调用方对指针所做的任何更改都将对调用方可见
  • 这里,我说的是指针本身的值(即它指向的位置),而不是指向对象的值。

    \include
    
    #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";
    }
    
    无效passByValue(int*p){ p=新整数; } void passByReference(int*&p){ p=新整数; } int main(){ int*p1=0; int*p2=0; passByValue(p1); passByReference(p2);
    std::cout这个小示例说明了通过引用传递指针的必要性

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

    或者更确切地说(当通过值传递P时),P永远不会指向内存中的不同位置(您可以解构对象并在同一位置构造新对象,从技术上讲,它是不同的对象)。我有一篇文章可能会对您有所帮助: