apunfun1

18
PASO DE PARAMETRO POR REFERENCIA O CUANDO 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. O 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. O VER APUNTADORES.

Upload: pabesacv

Post on 08-Jul-2015

1.485 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Apunfun1

PASO DE PARAMETRO POR REFERENCIA

O CUANDO UNA FUNCION DEBE MODIFICAR ELVALOR DEL PARAMETRO PASADO YDEVOLVER ESTE VALOR MODIFICADO A LAFUNCION LLAMADORA, SE HA DE UTILIZAR ELMETODO DE PASO DE PARAMETRO PORREFERENCIA.

O EN ESTE METODO EL COMPILADOR PASA LADIRECCION DE MEMORIA DEL VALOR DELPARAMETRO A LA FUNCION. CUANDO SEMODIFICA EL VALOR DEL PARAMETRO (LAVARIABLE LOCAL), ESTE VALOR QUEDAALMACENADO EN LA MISMA DIRECCION DEMEMORIA, POR LO QUE AL RETORNAR A LAFUNCION LLAMADORA LA DIRECCION DE LAMEMORIA DONDE SE ALMACENO ELPARAMETRO CONTENDRA EL VALORMODIFICADO.

O VER APUNTADORES.

Page 2: Apunfun1

APUNTADORES

O Definición: Un apuntador es una variable que contiene una dirección de memoria.

O Supongamos una variable de tipo entero que se llama contenido RAM y otra

O variable que se llama dirección RAM que puede contener una variable de tipo

O entero. En C/C++ una variable precedida del operador & devuelve la dirección

O de la variable en lugar de su contenido. Así que para asignar la dirección de

O una variable a otra variable del tipo que contiene direcciones se usan sentencias como estas:

Page 3: Apunfun1

APUNTADORES

O direccionRam = &contenidoRAM

O contenidoRAM se asigna a la localidad de

memoria con dirección 7751

Page 4: Apunfun1

APUNTADORES

O se ilustra el nombre de la variable contenidoRAM y seobserva

O que se encuentra en la dirección 7751 de la memoria. Elcontenido de esta

O localidad no se muestra. Una variable que contiene unadirección, tal como

O direccionRAM, se llama variable apuntador o simplementeapuntador.

O Después que la sentencia anterior se ejecuta, la dirección de contenidoRAM

O será asignada a la variable apuntador direccionRAM. La relación se expresa

O diciendo que direccionRAM apunta a contenidoRAM

Page 5: Apunfun1

APUNTADORES

O El acceso al contenido de una celda cuya direcciónesta almacenada en la

O variable direccionRAM es tan sencillo como poner alinicio de la variable

O apuntador un asterisco: *direccionRAM. Lo que se hahecho es eliminar la

O referencia directa. Por ejemplo, si se ejecutan lassiguientes dos sentencias, el

O valor de la celda llamada contenidoRAM será de 20

Page 6: Apunfun1

APUNTADORES

O direccionRAM = &contenidoRAM;O *direccionRAM = 20;

O contenidoRAM se le asigna el valor entero 20

Page 7: Apunfun1

DECLARACIONES DE VARIABLES APUNTADOR

O C/C++ requiere una definición para cada

variable. Para definir una variable

O apuntador direccionRAM que pueda

contener la direcci´on de una variable

O int, se escribe:

O int *direccionRAM;

Page 8: Apunfun1

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLASO Realmente existen dos partes

separadas en esta declaración. El tipo de dato

O de direccionRAM es:O int *O y el identificador para la variable esO direccionRAMO El 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:

O int *

Page 9: Apunfun1

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLASO En C/C++ una variable apuntador contiene la

dirección de un tipo de datoO particular:O char *direccion_char;O char *direccion_int;O El tipo de dato de dirección char es diferente del tipo

de dato de la variableO apuntador 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:

O int *direccion_int;O float un_float = 98.34;O direccion_int = &un_float;

Page 10: Apunfun1

#include <iostream.h>

using namespace std;

int main (int argc, char * const argv[])

{

system(„cls‟);

int A_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;

}

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS

Page 11: Apunfun1

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 2385

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS

Page 12: Apunfun1

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_int

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS

Page 13: Apunfun1

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

Page 14: Apunfun1

UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS

*direccion_int = B_int;

Se copia Temp int en B int utilizando asignación normal.

Page 15: Apunfun1

#include <iostream.h>

using namespace std;

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 EN SENTENCIAS SENCILLAS

Page 16: Apunfun1

UTILIZACION DE PUNTEROS CON FUNCIONES

#include <iostream.h>

using namespace std;

int cubo (int *);

int main()

{

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;

}

int cubo(int *apuntador)

{

*apuntador=*apuntador * *apuntador * *apuntador;

}

Page 17: Apunfun1

#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

Page 18: Apunfun1

DIFERENCIA ENTRE LOS PARAMETROS POR VALOR Y POR REFERENCIA

O LOS PARAMETROS POR VALOR(DECLARADOS SIN &) RECIBEN COPIASDE LOS VALORES DE LOS ARGUMENTOSQUE SE PASAN Y

O LA ASIGNACION A PARAMETROS PORVALOR DE UNA FUNCION NUNCACAMBIAN EL VALOR DEL ARGUMENTOORIGINAL PASADO A LOS PARAMETROS.

O LOS PARAMETROS POR REFERENCIA (DECLARADOS CON &) RECIBEN LADIRECCION DE LOS ARGUMENTOSPASADOS Y

O EN UNA FUNCION, LAS ASIGNACIONES APARAMETROS POR REFERENCIACAMBIAN LOS VALORES DE LOSARGUMENTOS ORIGINALES.