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.