Punteros
9. Pasaje por valor.
Contexto de las variables.
Recordemos que las variables tienen un contexto:
- Global
- Local
- Bloque
En el caso de una variable local definida por ejemplo en la definición de una función se crear una copia local, que puede o no llamarse igual, pero NUNCA serán lo mismo.
Ejemplo:
#include <iostream>
using namespace std;
void funcion1(float); //función prototipo
int main(){
float a=10;//a variable local de main
funcion1(a);
cout<<"Valor de a="<<a<<" en main";//muestro la variable local a de main
}
void funcion1(float a){ //defino a como variable local
a=20;//la varaible local a toma valor 20
cout<<"Valor de a="<<a<<" en funcion1"<<endl;
}
La salida de este programa será:
Figura 1
Lo que confirma la idea planteada que se crea una copia. En realidad podríamos haber llamado a la variable dentro de la función con "b", pero se le dió el mismo nombre en main y en funcion1, para resaltar el hecho que ES UNA COPIA LOCAL lo que usa funcion1.
Lo visto es válido para punteros. Vemos un ejemplo.
#include <iostream>
using namespace std;
void por_valor(float*,float);
int main(){
float b=10;//b variable local de main
float* p1 = NULL;//p1 puntero local de main inicializado a NULL
cout<<"Antes de llamar a la funcion:"<<endl;
cout<<"valor de b:"<<b<<endl;
cout<<"p1 apunta a: "<<p1<<endl;
cout<<"Ahora llamo a la funcion:"<<endl;
por_valor(p1,b); //paso el valor del puntero p1 y b a la función
cout<<"---Nuevamente dentro de de main --"<<endl;
cout<<"valor de b:"<<b<<endl;
cout<<"p1 apunta a: "<<p1<<endl;
cout<<"la direccion de b es: "<<&b<<endl;
return 0;
}
void por_valor(float* p,float b){//se crea una copia local de los valores recibidos
p = &b; //inicializo puntero local p de la función con el valor de la variable local b
//ahora p apunta a la variable local
cout<<"---Dentro de la funcion----"<<endl;
cout<<"valor de b:"<<b<<endl;
cout<<"la direccion de b es: "<<&b<<endl;
cout<<"valor del puntero: "<<*p<<endl;
}
La salida de este código será:
Pese a que la función por_valor recibe un puntero crea una copia local dentro de la función, este es inicializado para que apunte a b en la línea de la función: p=&b , pero esta inicialización es SOLO válida dentro de la función.
Esto es una muestra clara que el valor decibido de main ( float* p1 = NULL; ) dentro de por_valor la COPIA (p = &b;) ES MODIFICADA lo que de manera clara muestra que se recibe un valor pero que NO tiene alcance mas allá de la función
ya que es una copia local.