1 / 34

Punteros

Punteros. Direcciones, Arreglos y Argumentos de Funciones. ¿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

eldon
Download Presentation

Punteros

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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. p apunta a num Operadores de Punteros Ejemplo p=# Dir de Memoria Contenido Variable p 1004 1000 1001 1002 1003 1004 . . . 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 a 1000 1001 1002 1003 1004 1005 1006 . . p1 1 2 1000 p1 1006

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

  22. a a b b 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 ptr

  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 0 1 2 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

More Related