Prerrequisito : Punteros vs Referencias en C++ .
Para una comprensión clara, comparemos el uso de «puntero a puntero» VS «Referencia a puntero» en algunos casos.
Nota: Está permitido usar «puntero a puntero» tanto en C como en C++, pero podemos usar «Referencia a puntero» solo en C++.
Pasar puntero a una función
Si se pasa un puntero a una función como parámetro y se intenta modificar, los cambios realizados en el puntero no se reflejan fuera de esa función. Esto se debe a que solo se pasa una copia del puntero a la función. Se puede decir que “pasar por puntero” es pasar un puntero por valor . En la mayoría de los casos, esto no presenta ningún problema. Pero el problema viene cuando modificas el puntero dentro de la función. En lugar de modificar la variable, solo está modificando una copia del puntero y el puntero original permanece sin modificar.
El siguiente programa ilustra esto:
CPP
#include <iostream> using namespace std; int global_Var = 42; // function to change pointer value void changePointerValue(int* pp) { pp = &global_Var; } int main() { int var = 23; int* ptr_to_var = &var; cout << "Passing Pointer to function:" << endl; cout << "Before :" << *ptr_to_var << endl; // display 23 changePointerValue(ptr_to_var); cout << "After :" << *ptr_to_var << endl; // display 23 return 0; }
Passing Pointer to function: Before :23 After :23
Pasar «puntero a un puntero» como parámetro para funcionar
El problema anterior se puede resolver pasando la dirección del puntero a la función en lugar de una copia de la función real. Para esto, el parámetro de la función debe aceptar un «puntero a puntero» como se muestra en el siguiente programa:
CPP
#include <iostream> using namespace std; int global_var = 42; // function to change pointer to pointer value void changePointerValue(int** ptr_ptr) { *ptr_ptr = &global_var; } int main() { int var = 23; int* pointer_to_var = &var; cout << "Passing a pointer to a pointer to function " << endl; cout << "Before :" << *pointer_to_var << endl; // display 23 changePointerValue(&pointer_to_var); cout << "After :" << *pointer_to_var << endl; // display 42 return 0; }
Passing a pointer to a pointer to function Before :23 After :42
¿Cómo llamar a una función con el parámetro «Referencia al puntero»?
Una referencia permite que la función llamada modifique una variable local de la función que llama. Por ejemplo, considere el siguiente programa de ejemplo donde fun() puede modificar la variable local x de main().
CPP
#include<iostream> using namespace std; void fun(int &x) { x = 20; } int main() { int x = 10; fun(x); cout<<"New value of x is "<<x; return 0; }
New value of x is 20
El siguiente programa muestra cómo pasar una «Referencia a un puntero» a una función:
CPP
#include <iostream> using namespace std; int gobal_var = 42; // function to change Reference to pointer value void changeReferenceValue(int*& pp) { pp = &gobal_var; } int main() { int var = 23; int* ptr_to_var = &var; cout << "Passing a Reference to a pointer to function" << endl; cout << "Before :" << *ptr_to_var << endl; // display 23 changeReferenceValue(ptr_to_var); cout << "After :" << *ptr_to_var << endl; // display 42 return 0; }
Passing a Reference to a pointer to function Before :23 After :42
Devolver un puntero desde una función
CPP
#include <iostream> using namespace std; int global_var = 42; // function to return a pointer int* returnPointerValue() { return &global_var; } int main() { int var = 23; int* ptr_to_var = &var; cout << "Return a pointer from a function " << endl; cout << "Before :" << *ptr_to_var << endl; // display 23 ptr_to_var = returnPointerValue(); cout << "After :" << *ptr_to_var << endl; // display 42 return 0; }
Return a pointer from a function Before :23 After :42
Devolviendo la referencia de la función
CPP
#include <iostream> using namespace std; int global_var = 42; // function to return reference value int& ReturnReference() { return global_var; } int main() { int var = 23; int* ptr_to_var = &var; cout << "Returning a Reference " << endl; cout << "Before :" << *ptr_to_var << endl; // display 23 ptr_to_var = &ReturnReference(); cout << "After :" << *ptr_to_var << endl; // display 42 return 0; }
Returning a Reference Before :23 After :42
Publicación traducida automáticamente
Artículo escrito por HamdyFouad y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA