1 Arreglos de Apuntadores char *flecha; define un apuntador a un caracter. char *car[5]; define un arreglo de 5 apuntadores a caracteres. 2 struct conjunto { int edad ; double sueldo ; char nombre[20] ; } stconj ; stconj.edad = 10 ; stconj.sueldo = 1200.5 ; stconj.nombre[0] = 'A' ; Con apuntadores: struct conjunto *pconj ; pconj = (struct conjunto *)malloc( sizeof( struct conjunto )); pconj->edad = 10 ; pconj->sueldo = 1200.5 ; pconj->nombre[0] = 'A' ; * Los apuntadores pueden servir para el manejo de estructuras, y su alojamiento dinmico. *Tienen adems la propiedad de poder direccionar a los miembros de las mismas utilizando el operador (->) . Apuntadores a Estructuras -Toshiba Preferred User -Escriba el titulo aqui -2 3 APUNTADORES COMO PARAMETROS DE FUNCONES Una estructura, se puede pasar a una funcin como argumento: struct conjunto { int edad; double sueldo ; char nombre[20] ; } datos ; void funcion( struct conjunto d); . . . funcion(datos); void otra_funcion( struct conjunto *p); otra_funcion(&datos); 4 APUNTADORES COMO RESULTADO DE UNA FUNCON Podemos declarar funciones que devuelven apuntadores a un tipo de datos: char *funcion1(char * var1 ) ; double *funcion2(int i, double j, char *k ) ; struct item *funcion3( struct stock *puntst ) ; El retorno de las mismas puede inicializar apuntadores del mismo tipo al que se devuelve o de un tipo distinto. void *malloc(int tamao) ; p = (double *)malloc( 64 ) ; -Toshiba Preferred User -Escriba el titulo aqui -3 5 malloc() Memory Allocation Las funciones malloc() y calloc() obtienen bloques contiguos de memoria dinmicamente void malloc(size_t n); Regresa un apuntador del tipo (void *) a n bytes de almacenamiento que no han sido inicializados, o NULL si no es posible ubicar los bytes solicitados. El tipo del argumento (size_t) esta definido en stdlib.h y es un tipo unsigned void calloc(size_t n, size_t size); Regresa un apuntador a suficiente espacio para almacenar un arreglo de n objetos del tamao especificado. free(p); Libera el especio reservado por una llamada a malloc o calloc. 6 malloc() Memory Allocation char *cp; cp = malloc(100); Solicita al sistema operativo 100 bytes consecutivos y asigna la direccin de comienzo de este bloque a cp. Es comn usar la funcin sizeof() para especificar el nmero de bytes. int *ip; ip = (int *) malloc(100*sizeof(int)); -Toshiba Preferred User -Escriba el titulo aqui -+ 7 Estructuras de datos Dinmicas Son estructuras que pueden variar en cuanto a la cantidad de sus componentes o a los tipos de datos que las componen. NULL NULL NULL 8 Estructuras de datos Dinmicas #include <stdio.h> typedef struct mynode { int val; struct mynode *next; }node; main() { int r1, r2, r3; node *n1, *n2, *n3, *n4; printf("Comienza el programa \n"); n1=(node *) malloc(sizeof(node)); n2=(node *) malloc(sizeof(node)); n3=(node *) malloc(sizeof(node)); n4=(node *) malloc(sizeof(node)); r1=initnodo(n4,8,NULL); r1=initnodo(n3,6,n4); r1=initnodo(n2,4,n3); r1=initnodo(n1,2,n2); r2 = sumanodos(n1); printf("La suma de los valores en los nodos es =%d\n",r2); } int initnodo( node *thisnode, int value, node *nextnode){ if (thisnode!=NULL) { thisnode->val=value; thisnode->next=nextnode; return 0; } return 1; } int sumanodos(node *nodo1){ int suma=0,cont=0; while (nodo1!=NULL) { suma=suma+nodo1->val; nodo1=nodo1->next; } return suma; } 8 6 8 8 6 4 8 6 4 2 n1 n2 n3 n4 -Toshiba Preferred User -Escriba el titulo aqui -5 76 Casting C es uno de los pocos lenguajes que permite forzar una variable de uno tipo para que sea de otro tipo (coercion). Esto se logra a travs del operador cast ( ). int num_entero; float num_real=9.87; num_entero=(int)num_real; /* asigna 9 a num_entero */ int num_entero=10; float floatnumber; floatnumber=(float)num_entero; /*floatnumber = 10.0. */ 77 Casting - Puede usarse con cualquiera de los tipos de datos simples: int num_entero; char letra='A'; num_entero=(int)letra; /* asigna 65 (El codigo ASCII de A) a numentero*/ - Algunas veces se realiza en forma automatica. - Una buena regla es: si tiene duda, coloque el cast. -Toshiba Preferred User -Escriba el titulo aqui -6 78 Casting Otro uso del cast es cuando se quiere estar seguro de que la divisin retorna el resultado que se desea: int num_entero, otro_entero; .... num_real = (float) num_entero / (float) otro_entero; /* Asegura que el resultado es real */ 79 Tipos de datos enumerados Los tipos de datos enumerados contienen una lista de constantes que pueden ser direccionadas como valores enteros. enum dias {lunes, martes, ..., domingo} semana; enum dias semana1, semana2; -Toshiba Preferred User -Escriba el titulo aqui -7 80 Tipos de datos enumerados Se pueden definir otros valores: enum escapes { bell = `a,backspace = `b, tab = `t, newline = `n, vtab = `v, return = `r}; ... O forzar que el valor inicial no sea el 0 : enum meses {ene = 1, feb, mar, ..., dic}; Est implcito que feb = 2 etc. 81 Tipos de datos enumerados Ejemplo: enum day {dom, lun, mar, mier, jue, vier, sab} d1, d2; d1 = vier; .... if (d1 == d2) .... -Toshiba Preferred User -Escriba el titulo aqui -8 15 Apuntadores y Funciones Es necesario pasar como parmetro la direccin de las variables para que stas puedan ser modificadas por la funcin swap(&a, &b) /* Llamada */ . . . void swap(int *px, int *py){ int temp; temp = *px /* contents of pointer*/ *px = *py; *py = temp; } 16 Apuntadores y Funciones Cuando un arreglo se pasa a una funcin como parametro lo que realmente se esta pasando es la ubicacin en memoria de su primer elemento: strlen(s) equivale strlen(&s[0]) La declaracion de la Iuncion es: int strlen(char s[]); Y una declaracion equivalente es : int strlen(char *s); porque char s[] es similar a char *s. -Toshiba Preferred User -Escriba el titulo aqui -9 17 Arreglos Multidimensionales y Apuntadores char *name[10]; char Aname[10][20]; Las instrucciones name[3][4] y Aname[3][4] son correctas en C. Sin embargo Aname is un arreglo de 2D de 200 elementos. name tiene 10 elementos que son apuntadores no inicilizados.La ventaja es que los vectores de cada fila pueden ser de longitudes diferentes 18 Lnea de Comandos #include<stdio.h> main (int argc, char **argv) { /* programa que imprime los argumentos de la lnea de comandos */ int i; printf(argc = %d\n,argc); for (i=0;i<argc;++i) printf(argv[%d]:%s\n,i,argv[i]); } -Toshiba Preferred User -Escriba el titulo aqui -10 19 Lnea de Comandos Si se invoca el programa (argum) con los siguientes argumentos: argum f1 "f2 f3 4 stop! La salida ser: argc = 6 argv[0] = argum argv[1] = f1 argv[2] = f2 argv[3] = f3 argv[4] = 4 argv[5] = stop! Los caracteres " se ignoran. 20 Entrada/Salida Archivos La primera operacin sobre un archivo antes de usarlo es abrirlo: FILE *fopen(char *name, char *mode) Los modos de apertura incluyen: "r -- lectura, "w -- escritura y "a -- insertar al final "append. -Toshiba Preferred User -Escriba el titulo aqui -11 21 Entrada/Salida Para abrir un archivo se debe declarar un (file pointer) que apunta a una estructura del tipo FLE. FILE *stream, *fopen(); if ((stream = fopen(myfile.dat,r)) == NULL) { printf(Can't open%s\n,myfile.dat); exit(1); }