apunfun1
Post on 08-Jul-2015
1.485 Views
Preview:
TRANSCRIPT
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.
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:
APUNTADORES
O direccionRam = &contenidoRAM
O contenidoRAM se asigna a la localidad de
memoria con dirección 7751
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
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
APUNTADORES
O direccionRAM = &contenidoRAM;O *direccionRAM = 20;
O contenidoRAM se le asigna el valor entero 20
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;
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 *
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;
#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
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
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
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.
#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
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;
}
#include <iostream.h>
using namespace std;
int cubo(int *);
main()
{
system(„cls‟);
int numero = 5;
int *apuntador;
apuntador=№
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"<<№
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 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.
top related