La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Prog. Univ. Rodriguez Rey Pablo J. 1Punteros Direcciones, Arreglos y Argumentos de Funciones.

Presentaciones similares


Presentación del tema: "Prog. Univ. Rodriguez Rey Pablo J. 1Punteros Direcciones, Arreglos y Argumentos de Funciones."— Transcripción de la presentación:

1 Prog. Univ. Rodriguez Rey Pablo J. 1Punteros Direcciones, Arreglos y Argumentos de Funciones

2 Prog. Univ. Rodriguez Rey Pablo J. 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 a)2 bytes para punteros near (dentro del mismo segmento de datos) b)4 bytes para punteros far (fuera del segmento de datos) Importante: El contenido de estos bytes se interpreta como una dirección

3 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 8 Declaración de punteros Ejemplos int *edad; float *altura; char *ptchar; long *cantidad;

9 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 10 Operadores de Punteros Ejemplo p=# Variable Dir de Memoria Contenido p num 1004 p apunta a num

11 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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, se usa como mnemónico de este valor. Ejemplo de expresiones válidas: if(ptr==NULL) {...} ptr=NULL;

16 Prog. Univ. Rodriguez Rey Pablo J. 16 Operaciones con Punteros Asignaciones Asignación indirecta var=*ptr; *ptr=25; Asignación de punteros ptr2=ptr1;

17 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 18 Operaciones con Punteros Comparación de punteros Se pueden comparar punteros en una expresión relacional. Ejemplo: //p y q punteros if(p

19 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 20 Importancia del Tipo Base Ejemplo: int a; //suponemos a en la posición 1000 int *p1; p1=&a; p1=p1+3; a p

21 Prog. Univ. Rodriguez Rey Pablo J. 21 Importancia del Tipo Base char *pch=3000; int *pint=3000; float *pfloat=3000; ch ch+1 ch+2 ch+3 ch+4. pint pint+1 pint+2 pfloat pfloat+1 Memoria Ejemplo:

22 Prog. Univ. Rodriguez Rey Pablo J. 22 Importancia del Tipo Base Tipo del puntero vs. Tipo de la variable int *ptr, a; long b; ptr=&a; ptr=&b; a b a b ptr

23 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 mat 0 1 2in

25 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 30 Argumentos de funciones Pasaje de argumentos por referencia: Declaración Tipo nombre_func(tipo *nombre_arg_form,...); Llamada Nombre_func(&arg_act);

31 Prog. Univ. Rodriguez Rey Pablo J. 31Resumen 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 Prog. Univ. Rodriguez Rey Pablo J. 32Resumen 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 Prog. Univ. Rodriguez Rey Pablo J. 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 Prog. Univ. Rodriguez Rey Pablo J. 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 "Prog. Univ. Rodriguez Rey Pablo J. 1Punteros Direcciones, Arreglos y Argumentos de Funciones."

Presentaciones similares


Anuncios Google