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"; }
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"; }
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.
- Un puntero puede reasignarse mientras que una referencia no puede, y debe asignarse solo en la inicialización.
- El puntero se puede asignar NULL directamente, mientras que la referencia no.
- Los punteros pueden iterar sobre una array, podemos usar operadores de incremento/decremento para ir al elemento siguiente/anterior al que apunta un puntero.
- 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.
- Un puntero a una clase/estructura usa ‘->’ (operador de flecha) para acceder a sus miembros, mientras que una referencia usa un ‘.’ (operador punto)
- 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; }
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