La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Direcciones, Arreglos y Argumentos de Funciones

Presentaciones similares


Presentación del tema: "Direcciones, Arreglos y Argumentos de Funciones"— Transcripción de la presentación:

1 Direcciones, Arreglos y Argumentos de Funciones
Punteros Direcciones, Arreglos y Argumentos de Funciones

2 ¿Que es un Puntero? Definición
Un puntero (u apuntador) es una variable cuyo contenido es una dirección de memoria (generalmente de otra variable) Desde el punto de vista del almacenamiento, un puntero posee un tamaño de 2 bytes para punteros near (dentro del mismo segmento de datos) 4 bytes para punteros far (fuera del segmento de datos) Importante: El contenido de estos bytes se interpreta como una dirección

3 Importancia de los Punteros
Los punteros son importantes, principalmente, por las siguientes razones: Proporcionan los medios para que las funciones puedan modificar sus argumentos de llamada. Se utilizan como sistemas de asignación dinámica de memoria en C.

4 Importancia de los Punteros
Los punteros son importantes, principalmente, por las siguientes razones: Hacen posible el uso de ciertas estructuras de datos tales como listas o árboles binarios. Proporcionan la manera de devolver varios datos desde una función mediante los argumentos de la misma.

5 Declaración de punteros
La declaración de un puntero consta de: Tipo base Carácter * Nombre de variable Formato general para la declaración de una variable puntero Tipo_base *nombre_de_variable;

6 Declaración de punteros
Tipo base Define el tipo de las variables a las cuales puede hacer referencia el puntero En teoría, cualquier tipo de puntero puede referenciar cualquier zona de la memoria (área de datos). Los punteros pueden ser: Tipificados Genéricos (sin tipo) Siendo mas comunes los primeros, puesto que sobre ellos puede aplicarse lo que luego veremos como “aritmética de punteros”

7 Declaración de punteros
Carácter * Indica que es una variable de tipo puntero y no una variable común del tipo especificado Nombre de variable Debe respetar todas las reglas para nombres de variables

8 Declaración de punteros
Ejemplos int *edad; float *altura; char *ptchar; long *cantidad;

9 Operadores de Punteros
Existen dos operadores especiales de punteros & Y * & Es un operador unario que devuelve la dirección de memoria de su operando. O sea la posición interna de la variable en la computadora, que no tiene nada que ver con el valor de la variable.

10 Operadores de Punteros
Ejemplo p=# Dir de Memoria Contenido Variable p 1000 1001 1002 1003 1004 . 1004 p apunta a num num

11 Operadores de Punteros
Cuidado!!! No se pude asignar arbitrariamente una dirección a una variable, por lo tanto el operador & no puede estar del lado izquierdo en una asignación. Expresiones como la que sigue no son válidas &x=constante;

12 Operadores de Punteros
* Es un operador unario, operador de indirección o desreferencia, cuando se aplica a un puntero, da acceso al objeto al que señala el apuntador. p=# Contnum=*p; /*se asigna a contnum el valor de num*/

13 Inicialización de Punteros
Importancia: Un puntero no inicializado puede provocar el fallo del sistema. Los errores con punteros no inicializados son difíciles de detectar.

14 Inicialización de Punteros
Se inicializa mediante el operador & void main() { char ch=‘a’; char *ptrchar; ptrchar=&ch; } Ptrchar ha sido inicializado con la dirección de ch.

15 Inicialización de Punteros
La constante 0 puede ser asignada a un apuntador y este puede compararse con 0. La constante NULL, definida en <stdio.h>, se usa como mnemónico de este valor. Ejemplo de expresiones válidas: if(ptr==NULL) {...} ptr=NULL;

16 Operaciones con Punteros
Asignaciones Asignación indirecta var=*ptr; *ptr=25; Asignación de punteros ptr2=ptr1;

17 Operaciones con Punteros
Aritmética de punteros Solo se pueden usar dos tipos de operaciones, la suma y la resta: Ptr+=10; Ptr++; Ptr--; Ptr2-ptr1; //cuidado al interpretar el resultado No se puede multiplicar, dividir ni sumar punteros entre sí.

18 Operaciones con Punteros
Comparación de punteros Se pueden comparar punteros en una expresión relacional. Ejemplo: //p y q punteros if(p<q) printf(“p apunta a una posición de memoria inferior a q”);

19 Importancia del Tipo Base
Las operaciones con punteros están fuertemente ligadas al tipo base de los mismos. Ejemplo ptr1=ptr1+9; No posiciona a ptr1 9 bytes a la derecha, sino 9*tamaño del tipo_base

20 Importancia del Tipo Base
Ejemplo: int a; //suponemos a en la posición 1000 int *p1; p1=&a; p1=p1+3; 1 2 1000 1001 1002 1003 1004 1005 1006 . a p1 1 2 1000 p1 1006

21 Importancia del Tipo Base
Ejemplo: Memoria ch ch+1 ch+2 ch+3 ch+4 . pint pint+1 pint+2 pfloat pfloat+1 3000 3001 3002 3003 3004 3005 3006 3007 char *pch=3000; int *pint=3000; float *pfloat=3000;

22 Importancia del Tipo Base
Tipo del puntero vs. Tipo de la variable int *ptr, a; long b; ptr=&a; ptr=&b; 1 2 ptr 1 2 a b ptr a b

23 Punteros y Arreglos La declaración
int mat[10]; Implica una sucesión consecutiva de elementos enteros que pueden referenciarse en forma indexada como mat[0] mat[1] mat[2] Si declaramos un puntero int *p; Vemos que P=&mat[0] es idéntico a p=mat

24 Punteros y Arreglos Con esto acabamos de comprobar que el nombre de un arreglo (sin índice) establece un puntero al comienzo del arreglo. Ejemplo: p=mat; p i n mat

25 Punteros y Arreglos Diferencia Importante:
A pesar de que el nombre del arreglo (sin índice) implica un puntero al primer elemento del mismo, su comportamiento no es exactamente el de un apuntador. Por ejemplo mat++ es una operación no permitida, pues se perdería la referencia al primer elemento y el arreglo quedaría inaccesible.

26 Punteros y Arreglos Para acceder al tercer elemento, puede usarse cualquiera de estas formas: mat[2] o *(p+2) o *(mat+2) Sin embargo p sigue apuntando al primer elemento del arreglo.

27 Punteros y Arreglos También se puede recorrer el arreglo, desplazando el puntero dentro del arreglo incrementándolo o decrementándolo p+=2; sitúa el puntero en el tercer elemento del arreglo y *p Permite el acceso al elemento del mismo.

28 Punteros y Arreglos Un cuidado a tener en cuenta es que C no realiza chequeos de límites en los arreglos, por lo cual queda bajo la responsabilidad exclusiva del programador.

29 Argumentos de funciones
Se pueden pasar argumentos a una función de dos maneras: Por valor El dato es copiado a la función, cualquier alteración dentro de la misma no afecta al dato en la función llamante. Por referencia La dirección del dato es pasada a la función, y el mismo puede ser accedido desde ella, alterando el dato en la rutina llamante.

30 Argumentos de funciones
Pasaje de argumentos por referencia: Declaración Tipo nombre_func(tipo *nombre_arg_form,...); Llamada Nombre_func(&arg_act);

31 Resumen Un puntero en una variable que guarda una dirección de memoria, generalmente de otra variable. Para declararlos se usa el caracter *. Para inicializarlos se usa & y para acceder a lo apuntado *. Operaciones Asignaciones. Algunas operaciones aritméticas. Comparaciones.

32 Resumen Un arreglo es un puntero especial.
C no controla algunas operaciones con punteros como los límites de los arreglos o el uso de punteros no inicializados, ser cuidadoso. A las funciones se les puede pasar un argumento de dos maneras: Valor copia del dato Referencia dirección del dato

33 Bibliografía Recomendada
Borland C++ - Manual de Referencia Herbert Schild - McGraw-Hill/Interamericana de España, S.A.U. Taller de Lenguajes I - Apuntes de la Materia Ing. Juan Manuel Conti - Facultad de Ciencias exactas y Tecnología El Lenguaje de Programación C Brian W. Kernighan, Dennis M. Ritchie Prentice-Hall Hispanoamericana, S.A.

34 Bibliografía Recomendada
Programación en C Byron S. Gottfried - McGraw-Hill Como programar en C/C++ H. M. Deitel y P. J. Deitel - Prentice Hall Hispanoamericana


Descargar ppt "Direcciones, Arreglos y Argumentos de Funciones"

Presentaciones similares


Anuncios Google