📜  在C++中通过指针传递Vs通过引用传递

📅  最后修改于: 2021-05-30 09:52:33             🧑  作者: Mango

在C++中,我们可以通过指针或引用将参数传递给函数。在这两种情况下,我们得到的结果都是相同的。因此,以下问题是不可避免的;什么时候比另一种更好?我们为什么一个使用另一个的原因是什么?

通过指针:

// C++ program to swap two numbers using
// pass by pointer.
#include 
using namespace std;
  
void swap(int* x, int* y)
{
    int z = *x;
    *x = *y;
    *y = z;
}
  
int main()
{
    int a = 45, b = 35;
    cout << "Before Swap\n";
    cout << "a = " << a << " b = " << b << "\n";
  
    swap(&a, &b);
  
    cout << "After Swap with pass by pointer\n";
    cout << "a = " << a << " b = " << b << "\n";
}

输出:

Before Swap
a = 45 b = 35
After Swap with pass by pointer
a = 35 b = 45

通过引用传递:

// C++ program to swap two numbers using
// pass by reference.
  
#include 
using namespace std;
void swap(int& x, int& y)
{
    int z = x;
    x = y;
    y = z;
}
  
int main()
{
    int a = 45, b = 35;
    cout << "Before Swap\n";
    cout << "a = " << a << " b = " << b << "\n";
  
    swap(a, b);
  
    cout << "After Swap with pass by reference\n";
    cout << "a = " << a << " b = " << b << "\n";
}

输出:

Before Swap
a = 45 b = 35
After Swap with pass by reference
a = 35 b = 45

参考变量和指针变量的区别
引用通常使用指针来实现。引用是相同的对象,只是名称不同,引用必须引用一个对象。由于引用不能为NULL,因此使用起来更安全。

  1. 不能重新引用时可以重新分配指针,并且只能在初始化时分配。
  2. 指针可以直接分配为NULL,而引用则不能。
  3. 指针可以遍历数组,我们可以使用++转到指针所指向的下一项。
  4. 指针是保存内存地址的变量。引用与其引用的项具有相同的内存地址。
  5. 指向类/结构的指针使用’->’(箭头运算符)访问其成员,而引用使用’。’(点运算符)
  6. 指针需要用*取消引用,以访问其指向的内存位置,而引用可以直接使用。
// C++ program to demonstrate differences between pointer
// and reference.
#include 
using namespace std;
  
struct demo
{
    int a;
};
  
int main()
{
    int x = 5;
    int y = 6;
    demo d;
      
    int *p;
    p =  &x;
    p = &y;                     // 1. Pointer reintialization allowed
    int &r = x;
    // &r = y;                  // 1. Compile Error
    r = y;                      // 1. x value becomes 6
      
    p = NULL;           
    // &r = NULL;               // 2. Compile Error
      
    p++;                        // 3. Points to next memory location
    r++;                        // 3. x values becomes 7
      
    cout << &p << " " << &x << endl;    // 4. Different address
    cout << &r << " " << &x << endl;    // 4. Same address
      
    demo *q = &d;
    demo &qq = d;
      
    q->a = 8;
    // q.a = 8;                 // 5. Compile Error 
    qq.a = 8;
    // qq->a = 8;               // 5. Compile Error
      
    cout << p << endl;        // 6. Prints the address
    cout << r << endl;        // 6. Print the value of x    
  
    return 0;
}

输出(由于我们在程序中打印地址,所以在不同的运行中可能有所不同):

0x7ffd09172c20 0x7ffd09172c18
0x7ffd09172c18 0x7ffd09172c18
0x4
7

参数传递中的用法:
每当我们不需要“重新设置”时,引用通常比指针更可取。

总体而言,请尽可能使用引用,而必须使用指针。但是,如果我们想编写同时使用C和C++编译器进行编译的C代码,则必须限制使用指针。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”