Ademas de lo indicado previamente, en C y C++ el default es el paso por valor, de modo que cualquier función
no modifica lo que recibe como parámetro
Código C++:
Ver originalvoid f( Tipo v ) {
v = 4; // se modifica una copia
}
// mas tarde
miVariable = 0;
f( miVariable ); // se invoca la función "cambiadora", cambia miVariable?
// miVariable sigue valiendo 0
lo que también ocurre con los punteros
Código C++:
Ver originalvoid f( Tipo* v ) {
v = <cualquier expresion>; // se modifica una copia
}
pero si está permitido modificar lo apuntado por los punteros, usándolos a ellos para llegar a los datos
Código C++:
Ver originalvoid f( Tipo* v ) {
v->dato = <cualquier expresion>; // se modifica el dato!
}
La soluciones que se pueden aplicar aquí, para modificar los punteros, pueden ser:
- retornar el puntero e invocar la función de acuerdo a esta definición
Código C++:
Ver originalT* f( T* v )
{
v = <nueva expresion>; // no se modifica v
return v;
}
// y luego
miPuntero = f( miPuntero );
- o bien pasar un puntero a puntero y desreferenciarlo al asignar
Código C++:
Ver originalvoid f( T** pv )
{
*pv = <nueva expresion>; // se modifica lo apuntado por v
}
// y luego
T* puntero;
f( & puntero );
En C++ también existe el paso por referencia, pero esto esconde un poco, en el momento de la invocación, el hecho que la función modificará el puntero.