Apunfun1
-
Upload
pabesacv -
Category
Technology
-
view
1.485 -
download
0
Transcript of Apunfun1
![Page 1: Apunfun1](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/1.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/2.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/3.jpg)
APUNTADORES
O direccionRam = &contenidoRAM
O contenidoRAM se asigna a la localidad de
memoria con dirección 7751
![Page 4: Apunfun1](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/4.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/5.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/6.jpg)
APUNTADORES
O direccionRAM = &contenidoRAM;O *direccionRAM = 20;
O contenidoRAM se le asigna el valor entero 20
![Page 7: Apunfun1](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/7.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/8.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/9.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/10.jpg)
#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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/11.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/12.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/13.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/14.jpg)
UTILIZACION DE PUNTEROS EN SENTENCIAS SENCILLAS
*direccion_int = B_int;
Se copia Temp int en B int utilizando asignación normal.
![Page 15: Apunfun1](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/15.jpg)
#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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/16.jpg)
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](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/17.jpg)
#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
![Page 18: Apunfun1](https://reader033.fdocuments.es/reader033/viewer/2022052910/559c294c1a28ab94408b47b3/html5/thumbnails/18.jpg)
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.