Indique como se realiza la declaracin y la Indique como se realiza la declaracin y la
llamada a una funcin Indique como se declara y asigna valores a un Indique como se declara y asigna valores a un array Describa las ventajas de usar estructuras y como se declaran Ejercicios Ejercicios Elabore un programa que lea una cadena de 50 Elabore un programa que lea una cadena de 50 caracteres y convierta las vocales en maysculas Elabore un programa que obtenga el determinante Elabore un programa que obtenga el determinante de una matriz 3x3 ingresada por el usuario PUNTEROS PUNTEROS (APUNTADORES) ( ) Sugerencias y herramientas para crear para crear y presentar diapositivas en formato panormico Contenido Contenido Direcciones en memoria Aritmtica de punteros Concepto de puntero (apuntador) P t ll id p Punteros constantes frente a punteros a constantes Puntero null y void Punteros a punteros Punteros a Arrays Punteros como argumento de funciones Punteros a funciones Punteros a Arrays Arrays de punteros Punteros a cadenas Punteros a funciones Punteros a estructuras Ejercicios Punteros a cadenas j Direccin de memoria Direccin de memoria Cuando una variable se declara, se asocian tres , atributos fundamentales con la misma: su nombre, su tipo y su direccin de memoria Int n; Asocia al nombre n, el tipo int y la direccin de alguna p y g posicin de memoria donde se almacena el valor de n Cont Cont Al valor de la variable se accede por medio de su p nombre. Por ejemplo, se puede imprimir el valor de n con la sentencia; Printf (%d,n); A la direccin de la variable se accede por medio del operador de direccin &. Por ejemplo, se puede imprimir la direccin de n con la sentencia: P i tf (% & ) Printf (%p,&n); Ejemplo 10 1 Ejemplo 10.1 Obtener el valor y la direccin de una variable # l d d h #include <stdio.h> #include <stdlib.h> int main () { { int n=75; printf("n=%d\n",n); printf("&n=%p\n" &n); printf( &n=%p\n ,&n); system("pause"); return 0; }} Concepto de puntero (apuntador) Concepto de puntero (apuntador) Un puntero es una variable que contiene una direccin de memoria El tipo de variable que almacena una direccin se denomina puntero Los punteros se rigen por estas reglas bsicas: Un puntero es una variable como cualquier otra; Un puntero es una variable como cualquier otra; Una variable puntero contiene una direccin que apunta a otra posicin en memoria En esa posicin se almacenan los datos a los que apunta el puntero En esa posicin se almacenan los datos a los que apunta el puntero Un puntero apunta a una variable de memoria Ejemplo 10 2 Ejemplo 10.2 #include <stdio.h> #i l d < dlib h> #include <stdlib.h> int main () { i 75 int n=75; int*p=&n; printf("n=%d, &n=%p, p=%p\n",n,&n,p); i tf("& % \ " & ) printf("&p=%p\n",&p); system("PAUSE"); return 0; } } Declaracin de punteros Declaracin de punteros Al igual que cualquier variable, las variables punteros g q q , p han de ser declaradas antes de utilizarlas. La declaracin de una variable puntero debe indicar al compilador el tipo de dato al que apunta el puntero; para ello se hace preceder a su nombre con un asterisco (*) asterisco (*) <tipo de dato apuntado>*<identificador de puntero> Fl t*f Float*f; Inicializacin de punteros Inicializacin de punteros La inicializacin de un puntero proporciona a ese puntero la direccin del dato correspondiente. Para asignar una direccin de memoria a un puntero se utiliza el operador de referencia &. &valor Int i; Int *p; P=&i; /*asigna la direccin de i a p*/ *p=50; /*asigna un valor a la direccin de memoria*/ p 50; / asigna un valor a la direccin de memoria / Indireccion de punteros Indireccion de punteros El uso de un puntero #include <stdio.h> #include <stdlib h> El uso de un puntero para obtener el valor al que apunta es decir #include <stdlib.h> char c; int main() { al que apunta, es decir, su dato apuntado se denomina indireccionar char *pc; pc=&c; for(c='A';c<='Z';c++) printf("%c",*pc); denomina indireccionar el puntero printf("\n"); system("pause"); return 0; } } Punteros null y void Punteros null y void Un puntero nulo no apunta a ninguna parte, no direcciona ningn dato lid i valido en memoria #define NULL 0 Otra forma de declarar un puntero nulo es asignar un valor de 0 Int *ptr=0; Los punteros nulos se utilizan con frecuencia en programas con arrays de punteros En C se puede declarar un puntero de modo que apunte a cualquier tipo de dato, es decir, no se asigna a un tipo de dato especifico. El mtodo es declarar el puntero como puntero void* denominado puntero genrico Void *prt Punteros a punteros Punteros a punteros Un puntero puede apuntar a otra variable puntero. Este Un puntero puede apuntar a otra variable puntero. Este concepto se utiliza con mucha frecuencia en programas complejos de C. para declarar un puntero a un puntero p j p p p se hace preceder a la variable con dos asteriscos (**) Int valor e=100; _ ; Int *ptr1=&valor_e; Int **ptr5=&ptr1; Int ptr5 &ptr1; Punteros y Arrays Punteros y Arrays Se pueden direccionar arrays como si fueran p y punteros y punteros como si fueran arrays. La posibilidad de almacenar y acceder a punteros y arrays, implica que se pueden almacenar cadenas de datos en elementos de arrays. Sin punteros eso no es posible, ya que no existe el tipo de dato cadena en C. no existen variables de cadena, i d d nicamente constantes de cadena Nombres de arrays como punteros Nombres de arrays como punteros Un nombre de un array es simplemente un puntero. Supongamos que se tiene la siguiente declaracin de un array: In lista[5]={10 20 30 40 50} In lista[5]={10,20,30,40,50} Si se manda a visualizar lista[0] se vera 10 y si se manda a visualizar *lista. Como un nombre de un array es un puntero, 0 tambin se vera 10 Dado que un nombre de un array contiene la direccin del primer elemento del array se debe indireccionar el puntero primer elemento del array, se debe indireccionar el puntero para obtener el valor del elemento Arrays de punteros Arrays de punteros Si se necesita reservar muchos punteros a muchos p valores diferentes, se puede declara un array de punteros. Un array de punteros es un array que contiene como elementos punteros, cada uno de los cuales apunta a un tipo de dato especifico. La linea siguiente reserva un array de diez variables puntero a siguiente reserva un array de diez variables puntero a enteros: Int *ptr[10]; Int ptr[10]; Inicializacin de un array de punteros a cadenas Inicializacin de un array de punteros a cadenas La inicializacin de un array de punteros a cadenas La inicializacin de un array de punteros a cadenas se puede realizar con una declaracin similar a esta; esta; Char * b [12]={ f b *nombres_meses[12]={enero,febrero,marzo, abril,mayo,junio,julio,agosto,septiembre, b i b di i b } octubre,noviembre,diciembre}; Punteros de cadenas Punteros de cadenas Los punteros se pueden utilizar en lugar de ndices p p g de arrays. Considrese la siguiente declaracin de un array de caracteres que contiene las letras del alfabeto; Char alfabeto[27]=ABCDE.z; [ ] ; P=&alfabeto[0] Printf(%c\n *p); Printf( %c\n , p); Aritmtica de punteros Aritmtica de punteros Al contrario que un nombre de un array, que es un puntero constante y no d difi t i bl d difi se puede modificar, un puntero es una variable que se puede modificar. Como consecuencia, se pueden realizar ciertas operaciones aritmticas sobre punteros A un puntero se le puede sumar o restar un entero n; esto hace que apunte A un puntero se le puede sumar o restar un entero n; esto hace que apunte n posiciones adelante, o atrs del actual. Las operaciones no validas son; suma, multiplicacin o divisin entre dos punteros Float m[20]; Float m[20]; Float *r; r=m; r++ r++ Ejemplo conversin de caracteres 10 8 Ejemplo conversin de caracteres 10.8 Convierte caracteres de minsculas a maysculas Convierte caracteres de minsculas a maysculas Punteros constantes frente a punteros a constantes Punteros constantes frente a punteros a constantes Un puntero constante es un puntero que no se puede Un puntero constante es un puntero que no se puede cambiar, pero que los datos apuntados por el puntero pueden ser cambiados Por otra parte un puntero pueden ser cambiados. Por otra parte, un puntero a una constante se puede modificar para apuntar a una constante diferente pero los datos apuntar a una constante diferente, pero los datos apuntados por el puntero no se pueden cambiar Punteros constantes Punteros constantes Para crear un puntero constante diferente de un array, se debe utilizar el siguiente formato: <Tipo de dato>*const<nombre puntero>=<direccin de variable>; variable>; Int x; Int y; y; Int *const p1=&x; *p1=y, es legal ya que se cambia el contenido de memoria p1=&y , no es legal ya que se cambia el valor del puntero Punteros a constantes Punteros a constantes El formato para definir un puntero a una constante es; p p ; Const<tipo de dato elemento>*<nombre puntero>=<direccin de constante>; Const int x=25; Const int y=50; Const int *p1=&x; P1=&y, p1 apunta a otra constante * 1 15 d il i *p1=15, crea un error de compilacin Punteros constantes a constantes Punteros constantes a constantes El ultimo caso a considerar es crear punteros constantes a constantes utilizando el formato siguiente; Const <tipo de dato elemento> *const <nombre puntero>=<direccion de constante>; puntero>=<direccion de constante>; Const int x=25; Const int *const p1=&x; p ; P1 es un entero constante que apunta a una constante entera x, cualquier intento de modificar p1 o bien *p1 producir un error producir un error Punteros como argumentos de funciones Punteros como argumentos de funciones Cuando se pasa una variable a una funcin (paso por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero a una variable a una funcin (paso por direccin) se puede cambiar el valor de la variable p ) p Void func1 (int *s, int t) int i, j; { i=5; * 6 j 7 *s=6; j=7; t=25; func1 (&i, j); }} Punteros a funciones Punteros a funciones Es posible crear punteros que apunten a funciones. En lugar p p q p g de direccionar datos, los punteros de funciones apuntan a cdigo ejecutable. Al igual que los datos, las funciones se almacenan en memoria y tienen direcciones iniciales En C se almacenan en memoria y tienen direcciones iniciales. En C se pueden asignar las direcciones iniciales de funciones a punteros. Tales funciones se pueden llamar en un modo p p indirecto, es decir mediante un puntero cuyo valor es igual a la direccin inicial de la funcin en cuestin Ti d (* F i ) ( li d ) Tipo_de_retorno (*punteroFuncion) (<lista de parametros>); Cont Cont Un puntero a una funcin es simplemente un puntero cuyo p p p y valor es la direccin del nombre de la funcin. Dado que el nombre es, en si mismo, un puntero; un puntero a una funcin es un puntero a un puntero constante es un puntero a un puntero constante Inicializacin de un puntero a una funcin Inicializacin de un puntero a una funcin La sintaxis general para inicializar un puntero a una funcin es: punteroFuncion = una funcin double calculo (int*v unsigned n) /*prototipo de funcin*/ double calculo (int*v; unsigned n); /*prototipo de funcin*/ double (*qf) (int*, unsigned); /*puntero a funcin*/ Int r[5]={3,5,6,7,1} { } double x; qf=calculo; /*asigna direccin de la funcin*/ =qf(r 5) /*llamada a la f ncin con el p ntero a f ncin*/ x=qf(r,5); /*llamada a la funcin con el puntero a funcin*/ Ejemplo 10 6 Ejemplo 10.6 Se desea ordenar un array de numero reales, la Se desea ordenar un array de numero reales, la ordenacin se va a realizar con la funcin qsort() Arrays de punteros de funciones Arrays de punteros de funciones Ciertas aplicaciones requieren disponer de numerosas p q p funciones, basadas en el cumplimiento de ciertas condiciones. Un mtodo para implementar tal aplicacin es utilizar una sentencia switch con muchos selectores case utilizar una sentencia switch con muchos selectores case. Otra solucin es utilizar un array de punteros de funcin. Se puede seleccionar una funcin de la lista y llamarla p y La sintaxis general de un array de punteros de funcin es: tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>) Punteros a estructuras Punteros a estructuras Un puntero tambin puede apuntar a una estructura. Se p p p puede declarar un puntero a una estructura tal como se declara un puntero a cualquier otro objeto y se declara un puntero estructura tal como se declara cualquier otra variable estructura: especificando un puntero en lugar del nombre de la variable estructura del nombre de la variable estructura Strcuct persona *p; /*se crea un puntero de estructura*/ p=&empleado; p=&empleado; Ejemplo 10 9 Ejemplo 10.9 En este ejemplo se declara el tipo estructura En este ejemplo se declara el tipo estructura t_persona, que se asocia con el tipo persona para facilidad de escritura Un array de esta estructura facilidad de escritura. Un array de esta estructura se inicializa con campos al azar y se muestran por pantalla pantalla Ejercicios Ejercicios Escribir un programa en que se lean 20 lneas de texto, cada lnea i d 80 M ll l d con un mximo de 80 caracteres. Mostrar por pantalla el numero de vocales que tiene cada lnea Se requiere evaluar las funciones f(x), g(x) y z(x) para todos los valores de x en el intervalo 0<=x<=3.5 con incrementos de 0.2. escribir un programa que evalu dichas funciones, utilizar un array de punteros a funcin. Las funciones son las siguientes; F(x)=3*e x -2x G(x)=-x*Sin(x)+1.5 ( ) ( ) Z(x)=x 3 -2x+1 Patrn de prueba de pantalla panormica (16:9) Prueba de la relacin de aspecto (Debe parecer circular) 16x9 4x3