PASO DE PARAMETRO POR REFERENCIACUANDO UNA FUNCION DEBE MODIFICAR EL VALOR DEL PARAMETRO PASADO Y DEVOLVER ESTE VALOR MODIFICADO A LA FUNCION LLAMADORA, SE HA DE UTILIZAR EL METODO DE PASO DE PARAMETRO POR REFERENCIA.EN ESTE METODO EL COMPILADOR PASA LA DIRECCION DE MEMORIA DEL VALOR DEL PARAMETRO A LA FUNCION. CUANDO SE MODIFICA EL VALOR DEL PARAMETRO (LA VARIABLE LOCAL), ESTE VALOR QUEDA ALMACENADO EN LA MISMA DIRECCION DE MEMORIA, POR LO QUE AL RETORNAR A LA FUNCION LLAMADORA LA DIRECCION DE LA MEMORIA DONDE SE ALMACENO EL PARAMETRO CONTENDRA EL VALOR MODIFICADO.VER APUNTADORES.
APUNTADORESDefinición: Un apuntador es una variable que contiene una dirección de memoria.Supongamos una variable de tipo entero que se llama contenido RAM y otravariable que se llama dirección RAM que puede contener una variable de tipoentero. En C/C++ una variable precedida del operador & devuelve la direcciónde la variable en lugar de su contenido. Así que para asignar la dirección deuna variable a otra variable del tipo que contiene direcciones se usan sentencias como estas:
APUNTADORESdireccionRam = &contenidoRAMcontenidoRAM se asigna a la localidad de memoria con dirección 7751
APUNTADORESse ilustra el nombre de la variable contenidoRAM y se observaque se encuentra en la dirección 7751 de la memoria. El contenido de estalocalidad no se muestra. Una variable que contiene una dirección, tal comodireccionRAM, se llama variable apuntador o simplemente apuntador.Después que la sentencia anterior se ejecuta, la dirección de contenidoRAMserá asignada a la variable apuntador direccionRAM. La relación se expresadiciendo que direccionRAM apunta a contenidoRAM
APUNTADORESEl acceso al contenido de una celda cuya dirección esta almacenada en lavariable direccionRAM es tan sencillo como poner al inicio de la variableapuntador un asterisco: *direccionRAM. Lo que se ha hecho es eliminar lareferencia directa. Por ejemplo, si se ejecutan las siguientes dos sentencias, elvalor de la celda llamada contenidoRAM será de 20
APUNTADORESdireccionRAM = &contenidoRAM; *direccionRAM = 20;contenidoRAM se le asigna el valor entero 20
DECLARACIONES DE VARIABLES APUNTADORC/C++ requiere una definición para cada variable. Para definir una variableapuntador direccionRAM que pueda contener la direcci´on de una variableint, se escribe:int *direccionRAM;
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLASRealmente existen dos partes separadas en esta declaración. El tipo de datode direccionRAM es:int *y el identificador para la variable esdireccionRAMEl asterisco que sigue a int significa “apuntador a”. Esto es, el siguiente tipo de dato es una variable apuntador que puede contener una dirección a un int:int *
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLASEn C/C++ una variable apuntador contiene la dirección de un tipo de datoparticular:char *direccion_char;char *direccion_int;El tipo de dato de dirección char es diferente del tipo de dato de la variableapuntador dirección int. En un programa que define un apuntador a un tipo de dato y utiliza este para apuntar a otro tipo de dato, pueden ocurrir errores en tiempo de ejecución y advertencias en tiempo de compilación. Una practica de programación pobre sería definir un apuntador de una forma y luego utilizar este de alguna otra forma. Por ejemplo:int *direccion_int;float un_float = 98.34;direccion_int = &un_float;
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS#include <iostream.h>usingnamespacestd;intmain (intargc, char * constargv[]) {system(‘cls’);intA_int=15, B_int=37, Temp_int;int *direccion_int;std::cout<<"El contenido de A_int es:"<<A_int<<"\n";std::cout<<"El contenido de B_int es:"<<B_int<<"\n";direccion_int = &A_int;Temp_int = *direccion_int; *direccion_int = B_int;B_int = Temp_int;cout<<"Despues del intercambio:"<<"\n\n";cout<<"El contenido de A_int es:"<<A_int<<"\n";cout<<"El contenido de B_int es:"<<B_int<<"\n";system(‘pause’);return 0; }
En la lınea (05) se han declarado tres variables de tipo entero, se da a cada celda un nombre y se inicializan 2 de estas. Supondremos que la dirección de memoria asignada para la variable A int es la dirección 5328, y la dirección en memoria RAM asignada para la variable B int es la dirección 7916, y la celda llamada Temp int se le ha asignado la dirección 2385UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
En la lınea (06) se define un apuntador a un tipo de dato entero llamado dirección int. La sentencia asigna la celda y da a esta un nombre. Luego, en la lınea (09), la tercera sentencia asigna a direccion_int la dirección de A_intUTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
La lınea (11) utiliza la expresión *direccion_int para acceder al contenido de la celda a la cual apunta direccion_int: Temp_int = *direccion_int; Por consiguiente, el valor entero 15 se almacena en la variable Temp_int. Si no se pone el * enfrente de direccion_int;, la sentencia de asignación almacenarıa ilegalmente el contenido de direccion_int en la celda nombrada Temp_int, pero se supone que Temp_int contiene un entero, no una dirección.Este puede ser un error muy difıcil de localizar puesto que muchos compiladores no emiten ninguna advertencia/error. Para empeorar el asunto, la mayorıa de los apuntadores son cercanos, lo que significa que ocupan 2 bytes (4 bytes para aplicaciones de 32-bits), el mismo tamaño que un entero en una PC. La sentencia (11) copia el contenido de la variable B int en la celda apuntada por la dirección almacenada en dirección int.UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS*direccion_int = B_int;Se copia Temp int en B int utilizando asignación normal.
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS#include <iostream.h>usingnamespacestd;main() {system(‘cls’);int a;int *apuntador;  a=7;  apuntador= &a;cout<<"la direccion de a es:\n"<<&a<<endl;cout<<"el valor de apuntador es:\n"<<apuntador<<endl;cout<<"el valor de a es:\n"<<a<<endl;cout<<"el valor de apuntador es:\n"<<*apuntador<<endl;cout<<"uso de * y &\n";cout<<*&apuntador;cout<<"\n";cout<<&*apuntador;cout<<"\n";cout<<*&a;system(‘pause’);return 0; }
UTILIZACION DE PUNTEROS CON FUNCIONES#include <iostream.h>usingnamespacestd;int cubo (int *);intmain() {system(“cls”);int numero = 5;cout<<"el valor original de numero es:\n"<<numero;  cubo(&numero);cout<<"\n";cout<<"el nuevo valor de numero es:\n"<<numero;system(‘pause`);return 0;  }intcubo(int *apuntador)  {  *apuntador=*apuntador * *apuntador * *apuntador;  }
#include <iostream.h>using namespace std;int cubo(int *); main() {  system(‘cls’);  int numero = 5;  int *apuntador;  apuntador=&numero;  cout<<"la direccion de numero es:\n"<<&apuntador;  cout<<"\n el valor de numero es:\n"<<numero;  cout<<"\n";  cubo(&numero);  cout<<"el nuevo valor de numero es:\n"<<numero;  cout<<"\nla direccion nueva de numero es:\n"<<&numero;  system(‘pause’);  return 0;  }  int cubo(int *apuntador)  {  *apuntador=*apuntador * *apuntador * *apuntador;  }UTILIZACION DE PUNTEROS CON FUNCIONES
DIFERENCIA ENTRE LOS PARAMETROS POR VALOR Y POR REFERENCIALOS PARAMETROS POR VALOR (DECLARADOS SIN &) RECIBEN COPIAS DE LOS VALORES DE LOS ARGUMENTOS QUE SE PASAN YLA ASIGNACION A PARAMETROS POR VALOR DE UNA FUNCION NUNCA CAMBIAN EL VALOR DEL ARGUMENTO ORIGINAL PASADO A LOS PARAMETROS.LOS PARAMETROS POR REFERENCIA ( DECLARADOS CON &) RECIBEN LA DIRECCION DE LOS ARGUMENTOS PASADOS YEN UNA FUNCION, LAS ASIGNACIONES A PARAMETROS POR REFERENCIA CAMBIAN LOS VALORES DE LOS ARGUMENTOS ORIGINALES.

Apunfun1

  • 1.
    PASO DE PARAMETROPOR REFERENCIACUANDO UNA FUNCION DEBE MODIFICAR EL VALOR DEL PARAMETRO PASADO Y DEVOLVER ESTE VALOR MODIFICADO A LA FUNCION LLAMADORA, SE HA DE UTILIZAR EL METODO DE PASO DE PARAMETRO POR REFERENCIA.EN ESTE METODO EL COMPILADOR PASA LA DIRECCION DE MEMORIA DEL VALOR DEL PARAMETRO A LA FUNCION. CUANDO SE MODIFICA EL VALOR DEL PARAMETRO (LA VARIABLE LOCAL), ESTE VALOR QUEDA ALMACENADO EN LA MISMA DIRECCION DE MEMORIA, POR LO QUE AL RETORNAR A LA FUNCION LLAMADORA LA DIRECCION DE LA MEMORIA DONDE SE ALMACENO EL PARAMETRO CONTENDRA EL VALOR MODIFICADO.VER APUNTADORES.
  • 2.
    APUNTADORESDefinición: Un apuntadores una variable que contiene una dirección de memoria.Supongamos una variable de tipo entero que se llama contenido RAM y otravariable que se llama dirección RAM que puede contener una variable de tipoentero. En C/C++ una variable precedida del operador & devuelve la direcciónde la variable en lugar de su contenido. Así que para asignar la dirección deuna variable a otra variable del tipo que contiene direcciones se usan sentencias como estas:
  • 3.
    APUNTADORESdireccionRam = &contenidoRAMcontenidoRAMse asigna a la localidad de memoria con dirección 7751
  • 4.
    APUNTADORESse ilustra elnombre de la variable contenidoRAM y se observaque se encuentra en la dirección 7751 de la memoria. El contenido de estalocalidad no se muestra. Una variable que contiene una dirección, tal comodireccionRAM, se llama variable apuntador o simplemente apuntador.Después que la sentencia anterior se ejecuta, la dirección de contenidoRAMserá asignada a la variable apuntador direccionRAM. La relación se expresadiciendo que direccionRAM apunta a contenidoRAM
  • 5.
    APUNTADORESEl acceso alcontenido de una celda cuya dirección esta almacenada en lavariable direccionRAM es tan sencillo como poner al inicio de la variableapuntador un asterisco: *direccionRAM. Lo que se ha hecho es eliminar lareferencia directa. Por ejemplo, si se ejecutan las siguientes dos sentencias, elvalor de la celda llamada contenidoRAM será de 20
  • 6.
    APUNTADORESdireccionRAM = &contenidoRAM;*direccionRAM = 20;contenidoRAM se le asigna el valor entero 20
  • 7.
    DECLARACIONES DE VARIABLESAPUNTADORC/C++ requiere una definición para cada variable. Para definir una variableapuntador direccionRAM que pueda contener la direcci´on de una variableint, se escribe:int *direccionRAM;
  • 8.
    UTILIZACION DE PUNTEROSEN SENTENCIAS SENCILLASRealmente existen dos partes separadas en esta declaración. El tipo de datode direccionRAM es:int *y el identificador para la variable esdireccionRAMEl asterisco que sigue a int significa “apuntador a”. Esto es, el siguiente tipo de dato es una variable apuntador que puede contener una dirección a un int:int *
  • 9.
    UTILIZACION DE PUNTEROSEN SENTENCIAS SENCILLASEn C/C++ una variable apuntador contiene la dirección de un tipo de datoparticular:char *direccion_char;char *direccion_int;El tipo de dato de dirección char es diferente del tipo de dato de la variableapuntador dirección int. En un programa que define un apuntador a un tipo de dato y utiliza este para apuntar a otro tipo de dato, pueden ocurrir errores en tiempo de ejecución y advertencias en tiempo de compilación. Una practica de programación pobre sería definir un apuntador de una forma y luego utilizar este de alguna otra forma. Por ejemplo:int *direccion_int;float un_float = 98.34;direccion_int = &un_float;
  • 10.
    UTILIZACION DE PUNTEROSEN SENTENCIAS SENCILLAS#include <iostream.h>usingnamespacestd;intmain (intargc, char * constargv[]) {system(‘cls’);intA_int=15, B_int=37, Temp_int;int *direccion_int;std::cout<<"El contenido de A_int es:"<<A_int<<"\n";std::cout<<"El contenido de B_int es:"<<B_int<<"\n";direccion_int = &A_int;Temp_int = *direccion_int; *direccion_int = B_int;B_int = Temp_int;cout<<"Despues del intercambio:"<<"\n\n";cout<<"El contenido de A_int es:"<<A_int<<"\n";cout<<"El contenido de B_int es:"<<B_int<<"\n";system(‘pause’);return 0; }
  • 11.
    En la lınea(05) se han declarado tres variables de tipo entero, se da a cada celda un nombre y se inicializan 2 de estas. Supondremos que la dirección de memoria asignada para la variable A int es la dirección 5328, y la dirección en memoria RAM asignada para la variable B int es la dirección 7916, y la celda llamada Temp int se le ha asignado la dirección 2385UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
  • 12.
    En la lınea(06) se define un apuntador a un tipo de dato entero llamado dirección int. La sentencia asigna la celda y da a esta un nombre. Luego, en la lınea (09), la tercera sentencia asigna a direccion_int la dirección de A_intUTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
  • 13.
    La lınea (11)utiliza la expresión *direccion_int para acceder al contenido de la celda a la cual apunta direccion_int: Temp_int = *direccion_int; Por consiguiente, el valor entero 15 se almacena en la variable Temp_int. Si no se pone el * enfrente de direccion_int;, la sentencia de asignación almacenarıa ilegalmente el contenido de direccion_int en la celda nombrada Temp_int, pero se supone que Temp_int contiene un entero, no una dirección.Este puede ser un error muy difıcil de localizar puesto que muchos compiladores no emiten ninguna advertencia/error. Para empeorar el asunto, la mayorıa de los apuntadores son cercanos, lo que significa que ocupan 2 bytes (4 bytes para aplicaciones de 32-bits), el mismo tamaño que un entero en una PC. La sentencia (11) copia el contenido de la variable B int en la celda apuntada por la dirección almacenada en dirección int.UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
  • 14.
    UTILIZACION DE PUNTEROSEN SENTENCIAS SENCILLAS*direccion_int = B_int;Se copia Temp int en B int utilizando asignación normal.
  • 15.
    UTILIZACION DE PUNTEROSEN SENTENCIAS SENCILLAS#include <iostream.h>usingnamespacestd;main() {system(‘cls’);int a;int *apuntador; a=7; apuntador= &a;cout<<"la direccion de a es:\n"<<&a<<endl;cout<<"el valor de apuntador es:\n"<<apuntador<<endl;cout<<"el valor de a es:\n"<<a<<endl;cout<<"el valor de apuntador es:\n"<<*apuntador<<endl;cout<<"uso de * y &\n";cout<<*&apuntador;cout<<"\n";cout<<&*apuntador;cout<<"\n";cout<<*&a;system(‘pause’);return 0; }
  • 16.
    UTILIZACION DE PUNTEROSCON FUNCIONES#include <iostream.h>usingnamespacestd;int cubo (int *);intmain() {system(“cls”);int numero = 5;cout<<"el valor original de numero es:\n"<<numero; cubo(&numero);cout<<"\n";cout<<"el nuevo valor de numero es:\n"<<numero;system(‘pause`);return 0; }intcubo(int *apuntador) { *apuntador=*apuntador * *apuntador * *apuntador; }
  • 17.
    #include <iostream.h>using namespacestd;int cubo(int *); main() { system(‘cls’); int numero = 5; int *apuntador; apuntador=&numero; cout<<"la direccion de numero es:\n"<<&apuntador; cout<<"\n el valor de numero es:\n"<<numero; cout<<"\n"; cubo(&numero); cout<<"el nuevo valor de numero es:\n"<<numero; cout<<"\nla direccion nueva de numero es:\n"<<&numero; system(‘pause’); return 0; } int cubo(int *apuntador) { *apuntador=*apuntador * *apuntador * *apuntador; }UTILIZACION DE PUNTEROS CON FUNCIONES
  • 18.
    DIFERENCIA ENTRE LOSPARAMETROS POR VALOR Y POR REFERENCIALOS PARAMETROS POR VALOR (DECLARADOS SIN &) RECIBEN COPIAS DE LOS VALORES DE LOS ARGUMENTOS QUE SE PASAN YLA ASIGNACION A PARAMETROS POR VALOR DE UNA FUNCION NUNCA CAMBIAN EL VALOR DEL ARGUMENTO ORIGINAL PASADO A LOS PARAMETROS.LOS PARAMETROS POR REFERENCIA ( DECLARADOS CON &) RECIBEN LA DIRECCION DE LOS ARGUMENTOS PASADOS YEN UNA FUNCION, LAS ASIGNACIONES A PARAMETROS POR REFERENCIA CAMBIAN LOS VALORES DE LOS ARGUMENTOS ORIGINALES.