Pasar por puntero frente a pasar por referencia en C++

En C++, podemos pasar parámetros a una función ya sea por punteros o por referencia. En ambos casos, obtenemos el mismo resultado. Entonces, ¿cuál es la diferencia entre pasar por puntero y pasar por referencia en C++?

Entendamos primero qué significa Pasar por puntero y Pasar por referencia en C++:
1) Pasar por puntero:  aquí, la ubicación de memoria de las variables se pasa a los parámetros en la función y luego se realizan las operaciones.

CPP

// C++ program to swap two numbers using
// pass by pointer
#include <iostream>
using namespace std;
 
void swap(int *x, int *y)
{
    int z = *x;
    *x = *y;
    *y = z;
}
 
// Driver Code
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";
}
Producción

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

2) Paso por Referencia:  Permite que una función modifique una variable sin tener que crear una copia de la misma. Tenemos que declarar variables de referencia. La ubicación de memoria de la variable y el parámetro pasados ​​es la misma y, por lo tanto, cualquier cambio en el parámetro también se refleja en la variable.

CPP

// C++ program to swap two numbers using
// pass by reference
 
#include <iostream>
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";
}
Producción

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

Diferencia entre la variable de referencia y la variable de puntero:
 
una referencia es el mismo objeto, solo que con un nombre diferente y una referencia debe referirse a un objeto. Dado que las referencias no pueden ser NULL, son más seguras de usar. 

  1. Un puntero puede reasignarse mientras que una referencia no puede, y debe asignarse solo en la inicialización.
  2. El puntero se puede asignar NULL directamente, mientras que la referencia no.
  3. Los punteros pueden iterar sobre una array, podemos usar operadores de incremento/decremento para ir al elemento siguiente/anterior al que apunta un puntero.
  4. Un puntero es una variable que contiene una dirección de memoria. Una referencia tiene la misma dirección de memoria que el elemento al que hace referencia.
  5. Un puntero a una clase/estructura usa ‘->’ (operador de flecha) para acceder a sus miembros, mientras que una referencia usa un ‘.’ (operador punto)
  6. Se debe desreferenciar un puntero con * para acceder a la ubicación de memoria a la que apunta, mientras que una referencia se puede usar directamente.

El siguiente ejemplo demuestra las diferencias:

CPP

// C++ program to demonstrate differences
// between pointer and reference
#include <iostream>
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
 
    // 3. Points to next memory location
    p++;
 
    // 3. x values becomes 7
    r++;
 
    cout << &p << " " << &x << '\n'; // 4. Different address
    cout << &r << " " << &x << '\n'; // 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
 
    // 6. Prints the address
    cout << p << '\n';
 
    // 6. Print the value of x
    cout << r << '\n';
 
    return 0;
}
Producción

0x7ffc7ed95828 0x7ffc7ed95820
0x7ffc7ed95820 0x7ffc7ed95820
0x4
7

¿Cuál se prefiere en Passing by Pointer Vs Passing by Reference en C++? 

  • Las referencias suelen preferirse a los punteros siempre que no necesitemos «volver a colocar».
  • En general, use referencias cuando pueda y punteros cuando sea necesario . Pero si queremos escribir código C que se compile tanto con C como con un compilador de C++, tendrá que limitarse a usar punteros.

Este artículo es una contribución de Rohit Kasle . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *