C para Sistemas Operativos Introducción a los Sistemas Operativos, 2015-2016 Pablo González Nalda Depto. de Lenguajes y Sistemas Informáticos 11 de febrero de 2016 Modificado el 11 de marzo de 2016 Contenidos de la presentación 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas 6 Qué es un puntero 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 2 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? 3 / 63 Programa “Hola, muy buenas...” Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas Subprogramas Qué es un puntero 4 /* Programa simple */ /* Comentario. No pueden anidarse */ #include <stdio.h> main( ) { printf("Hola, muy buenas..."); } Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 4 / 63 Variables Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices Cadenas Subprogramas 6 Qué es un puntero 9 Tipos de punteros y tablas #include <stdio.h> main( ) { int entero; /* entero con signo */ char caracter; /* carácter ASCII */ float real; /* real simple precisión */ entero = 2+2; caracter = ’a’; real=6.023E23; printf("\nResultado: %d\t’ %c’ ",entero, caracter); printf("\treal %f", real); } Punteros y cadenas Punteros y estructuras ¿Más preguntas? 5 / 63 Constantes Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas 7 #include <stdio.h> #define MAX 50 main( ) { const int entero=3; const float PI=3.1415926; printf("\nResultado: %d, otros %d %d",entero, 66, MAX); printf("\treal %f", real); } Punteros y cadenas Punteros y estructuras ¿Más preguntas? 6 / 63 Control de compilación Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas 7 #include <stdio.h> #define PRUEBA main( ) { #ifdef PRUEBA printf("Prueba"); #else printf("No hay prueba"); #endif } Punteros y cadenas Punteros y estructuras ¿Más preguntas? 7 / 63 Control de compilación Contenidos Parte básica de la sintaxis de C Control de flujo Matrices 3 Cadenas Subprogramas 6 Qué es un puntero Tipos de punteros y tablas 1 #include <stdio.h> main( ) { #ifdef PRUEBA printf("Prueba"); #else printf("No hay prueba"); #endif } gcc -o prueba prueba.c -DPRUEBA Punteros y cadenas Punteros y estructuras ¿Más preguntas? 8 / 63 Dualidad carácter/valor ASCII" Contenidos Parte básica de la sintaxis de C Control de flujo 2 Matrices Cadenas 5 Subprogramas Qué es un puntero 8 Tipos de punteros y tablas 11 #include <stdio.h> main( ) { char a=’C’,b=’f’, c=’3’; int x; x=a-’A’; printf("\nDistancia: %d",x); printf("\nValor numérico: %d", c-’0’); /* 51-48 */ a=a+(’a’-’A’); /* +32 pasa a minúsculas*/ b=b-32; /* Pasa a mayúsculas */ printf("\n %c \t %c", a,b); /* resultado */ } Punteros y cadenas Punteros y estructuras ¿Más preguntas? 9 / 63 Operadores matemáticos Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas 4 a=-b; a=a+b; a=c-b; a=c*b; a=c/b; Si son enteros, sólo da el cociente de la división. Si uno de ellos (por lo menos) es real, da la división con todos los decimales posibles a=c %b; Sólo se puede usar con enteros, y da el resto de la división entera Punteros y cadenas Punteros y estructuras ¿Más preguntas? 10 / 63 Abreviaturas Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices Cadenas Subprogramas 6 Qué es un puntero 9 Tipos de punteros y tablas a=a+1; -> a++; o también ++a; b=b-1; -> b--; o también --b; b = b + c; -> b += c; b = b - c; -> b -= c; b = b * c; -> b *= c; b = b / c; -> b /= c; ¡¡Cuidado!! c=3; b=c+1; -> b tiene 4 y c tiene b=c++; -> b tiene 3 y c tiene b=++c; -> b tiene 4 y c tiene (Hay diferencia) (Hay diferencia) 3 (d=c+1; 4 (d=c; c=c+1; 4 (c=c+1; d=c; b=d;) b=d;) b=d;) Punteros y cadenas Punteros y estructuras ¿Más preguntas? 11 / 63 Entrada/Salida Contenidos 1 Parte básica de la sintaxis de C Control de flujo 4 Matrices Cadenas 7 Subprogramas Qué es un puntero 10 Tipos de punteros y tablas 13 Punteros y cadenas Punteros y estructuras 16 #include <stdio.h> void main(){ int num; char car, nombre[10]; /* Cadena de caracteres */ printf("Introduce un numero entero"); scanf(" %d", &num); printf(" la variable \"car\": "); fflush(stdin); /* Vacía el búfer del teclado */ scanf(" %c", &car); fflush(stdin); printf("\nIntroduce un nombre"); scanf(" %s", nombre); printf("\n\nEl número es %d, \t y el ", num); printf("carácter %c.\n", car); printf("La cadena es %s", nombre); } ¿Más preguntas? 12 / 63 Operaciones lógicas con bits Contenidos 2 Parte básica de la sintaxis de C Control de flujo 5 Matrices Cadenas 8 Subprogramas Qué es un puntero 11 Tipos de punteros y tablas 14 Punteros y cadenas Punteros y estructuras 17 #include <stdio.h> main() { char dato, mascara=0x01; /* mascara=1 */ int i, cont=0; scanf(" %c", &dato); for (i=0; i<8; i++) { printf(" %d",((dato&mascara)!=0)); if((dato & mascara)!=0) cont++; /* and de bits */ mascara = mascara << 1; /* Desplazamiento de */ } /* bits a la izq */ printf("\nEn ’ %c’ hay %d unos\n", dato,cont); } & | ~ ^ and or not xor >> Desplazamiento a la derecha << Desplazamiento a la izquierda Lo mismo con iguales &= |= <<= >>= ^= ¿Más preguntas? 13 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? 14 / 63 Condicionales Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero 7 if (b == 0) { a=1; } else { a=2; } a = (b==0 ? 1 : 2 ); Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 15 / 63 Operaciones condicionales Contenidos Parte básica de la sintaxis de C Control de flujo 2 Matrices Cadenas 5 Subprogramas Qué es un puntero Tipos de punteros y tablas 8 < menor que <= menor o igual que == igual (dos iguales) != distinto de > mayor que >= mayor o igual que || uno u otro, o los dos (or lógico) && uno y otro (and lógico) !( expresión) no es cierto, no ocurre ese algo (not lógico ) Punteros y cadenas Punteros y estructuras ¿Más preguntas? 16 / 63 Ejemplo de condicionales: if Contenidos 3 Parte básica de la sintaxis de C Control de flujo 6 Matrices Cadenas 9 Subprogramas Qué es un puntero Tipos de punteros y tablas 12 15 Punteros y cadenas 18 Punteros y estructuras ¿Más preguntas? 21 /* if anidados adecuados para switch.C */ #include <stdio.h> int nota; void main() { printf("Dame tu nota "); scanf(" %d", &nota); if(nota==0||nota==1||nota==2|| nota==3 ||nota==4) { printf("\nLo siento, has suspendido \n"); printf("Si intentas otra, apruebas\n\n"); } else if (nota==5 || nota==6) printf("\nUn aprobado \n"); else if (nota==7 || nota==8) printf("\nUn notable, muy bien \n"); else if (nota==9) printf("\nSobresaliente \n"); else if (nota==10) printf("\nFelicidades, un 10 \n"); else if (nota==11) { printf("\n Menos lobos... \n"); printf("\n¿Qué nota es ésa? \n"); } else printf("\n¿Qué nota es ésa? \n"); getch(); /* para el programa hasta pulsar una tecla*/ 17 / 63 } Ejemplo de condicionales: switch 1 Contenidos Parte básica de la sintaxis de C 4 Control de flujo 7 Matrices Cadenas Subprogramas 10 Qué es un puntero 13 Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 16 19 ¿Más preguntas? 22 #include <stdio.h> int nota; void main(){ printf("Dame tu nota "); scanf(" %d", &nota); switch(nota){ case 0: case 1: case 2: case 3:case 4: printf("\nLo siento, has suspendido \n"); printf("Si intentas otra vez, apruebas\n\n"); break; case 5:case 6: printf("\nUn aprobado \n"); break; case 7: case 8: printf("\nUn notable, muy bien \n"); break; case 10: printf("\nFelicidades, un 10 \n"); case 9: printf("\nSobresaliente \n"); break; case 11: printf("\n Menos lobos... \n"); default: printf("\n¿Qué nota es ésa? \n"); } /* fin switch */ 18 / 63 getch(); /* para el programa hasta pulsar tecla*/ Ejemplo de iterativas Contenidos Parte básica de la sintaxis de C 3 Control de flujo Matrices 6 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 9 #include <stdio.h> void main() { char sn; int n=10; do { printf("\n¿seguimos?(S/N)"); fflush(stdin); scanf(" %c", &sn); } while (sn==’s’ || sn==’S’); while (n>0) { printf("\t %d,",n); n--; } printf("\t %d.",n); 12 15 } ¿Más preguntas? 19 / 63 Ejemplo de iterativas: for Contenidos 2 Parte básica de la sintaxis de C Control de flujo 5 Matrices Cadenas 8 Subprogramas Qué es un puntero 11 Tipos de punteros y tablas 14 Punteros y cadenas Punteros y estructuras 17 for (cont=1; cont<=10; cont=cont+1) printf("\n¡Hola!"); // Para imprimir los múltiplos de 7 menores de 500: for (cont=7; cont<500; cont=cont+7) printf("\n %d",cont); // Y si queremos una cuenta atrás: for (cont=10; cont>0; cont=cont-1) printf("\n %d",cont); // O también: for (cont=10; cont>0; cont--) printf("\n %d",cont); // O también: cont=10; while (cont>0) printf("\n %d",cont--); // El factorial en una línea (digamos que es ilegible): for(i=1,f=1; i<=x; f*=i, i++); for(i=f=1; i<=x; f*=i++); ¿Más preguntas? 20 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? 21 / 63 Tablas, arrays, vectores, matrices, arreglos Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices Cadenas 6 Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas 9 12 #include <stdio.h> #define N 10 main( ) { int i, v[N], aux; for (i=0; i<N; i++) { printf("\nDame el %dº valor: ",i+1); scanf(" %d", &v[i]); } aux=v[0]; for (i=0; i<N-1; i++) v[i]=v[i+1]; v[N-1]=aux; printf("\nDesplazada a la izquierda: \n"); for (i=0; i<N; i++) printf("\t %d ", v[i]); } Punteros y estructuras ¿Más preguntas? 22 / 63 Matrices multidimensionales Contenidos Parte básica de la sintaxis de C Control de flujo Matrices 1 Cadenas Subprogramas 4 float t[2][5]= {{1,2,3,4,5},{6,7,8,9,0}}; ... printf (" %d",t[1][3]); // imprimirá 9 printf (" %d",t[3][1]); // no es correcto Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 23 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas 6 Qué es un puntero 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 24 / 63 Cadenas o strings Contenidos Parte básica de la sintaxis de C En C, una cadena es una tabla de caracteres terminada con un cero binario (ASCII 0 o ’0\0’) Control de flujo Matrices Cadenas 2 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas 5 8 char cad[40]; cad[0] = ’h’; cad[1] = ’o’; cad[2] = ’l’; cad[3] = ’a’; cad[4] = ’\0’; char cad[40]= {’H’,’o’,’l’,’a’,’\0’}; char cad[40]= "Hola"; Punteros y cadenas Punteros y estructuras ¿Más preguntas? 25 / 63 Cadenas de Caracteres Contenidos 3 Parte básica de la sintaxis de C Control de flujo 6 Matrices Cadenas Cadenas 9 Subprogramas Qué es un puntero 12 Tipos de punteros y tablas 15 Punteros y cadenas #include <stdio.h> #include <string.h> #define N 255 void main() { char cad[N],cad2[N],cop[]="Cadena copiada"; /* 15 pos. */ int i=0, longitud; printf("\n\nDame una cadena que la copio en otra: \n"); gets(cad); /* Pido una cadena con espacios */ longitud=strlen(cad); while (cad[i]!=’\0’){ cad2[i]=cad[i]; /* Copiamos si cad[i]!=’\0’ */ printf("\ncad[ %d]= %c",i,cad2[i]); i=i+1; } /* Equivalente a strcpy(cad,cad2); */ cad2[i]=’\0’; /* Añadimos el fin de cadena*/ printf("\n\n %s: \n %s", cop, cad2); } Punteros y estructuras ¿Más preguntas? En la condición del while podríamos poner (i<longitud) y el programa sería equivalente. Si ponemos (i<=longitud) también copiaría el carácter de fin de cadena, lo mismo que si usáramos do while. 26 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? 27 / 63 Subprogramas Contenidos 1 Parte básica de la sintaxis de C Control de flujo 4 Matrices Cadenas 7 Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 10 #include <stdio.h> long fact(int n); main( ) { printf("\nEl factorial de 14 es %ld", fact(14)); } long fact(int n) { /* iterativo */ long r=1l; int i; for (i=1; i<=n; i++) r*= (long) i; return r; } La función devuelve un long a partir del dato de entrada int ¿Más preguntas? 28 / 63 Funciones y Booleanos Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices Cadenas 6 Subprogramas Qué es un puntero 9 Tipos de punteros y tablas 12 Punteros y cadenas #include <stdio.h> #define VERD 1 #define FALSO 0 main( ) { if (es_negativo(5)) printf("5 es negativo"); } int es_negativo(int n) { if (x<0) return VERD; else return FALSO; } Punteros y estructuras ¿Más preguntas? 29 / 63 Funciones sobre matrices Contenidos Parte básica de la sintaxis de C 2 Control de flujo 5 Matrices Cadenas Subprogramas 8 Qué es un puntero 11 Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 14 #include <stdio.h> #define N 100 int media(int t[], int nelem) { int i, s=0; for (i=0; i<nelem; i++) s+=t[i]; return s; } main( ) { int tabla[N],i; for (i=0; i<N; i++) { printf("\nDame el %dº valor: ",i+1); scanf(" %d", &v[i]); } printf("\nLa media de la mitad de la tabla es "); printf(" %d", media(tabla,N/2)); } ¿Más preguntas? 30 / 63 Procedimientos 2 Contenidos Parte básica de la sintaxis de C 5 Control de flujo Matrices 8 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas 11 14 Punteros y cadenas 17 Punteros y estructuras ¿Más preguntas? 20 #include <stdio.h> #define N 10 void pedir_tabla(int t[]) { int i; for (i=0; i<N; i++) scanf(" %d", &t[i]); } void izq(int v[]) { int i, aux; aux=v[0]; for (i=0; i<N-1; i++) v[i]=v[i+1]; v[N-1]=aux ; } void mostrar_tabla(int t[]) { int i; for (i=0; i<N; i++) printf("\t %d ", t[i]); } main( ) { int v[N]; pedir_tabla(v); izq(v); printf("\nDesplazada a la iquierda: \n"); mostrar_tabla(v); 31 / 63 } Procedimientos con cadenas Contenidos 2 Parte básica de la sintaxis de C 5 Control de flujo Matrices Cadenas 8 Subprogramas Qué es un puntero Tipos de punteros y tablas 11 14 Punteros y cadenas Punteros y estructuras ¿Más preguntas? 17 #include <stdio.h> #include <string.h> #define N 255 void copiar_cadena(char cad[], char cad2[]) { int i=0, longitud; longitud=strlen(cad); while (i<longitud){ cad2[i]=cad[i]; /* Copiamos si cad[i]!=’\0’ */ i=i+1; } cad2[i]=’\0’; /* Añadimos el fin de cadena*/ } void main() { char cad[N],cad2[N],cop[]="Cadena copiada"; /*cop 15 pos.*/ printf("\n\nDame una cadena que la copio en otra: \n"); gets(cad); /* Pido una cadena con espacios */ copiar_cadena(cad,cad2); printf("\n\n %s: \n %s", cop, cad2); } 32 / 63 Variables por valor y por referencia Contenidos Parte básica de la sintaxis de C Control de flujo Matrices 2 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas 5 // Las variables simples, si no se usan punteros, se pasan por valor: int suma (int a, int b) return a+b; s= suma(c,d); // Las variables compuestas, siempre se pasan por referencia, por ser su nombre un puntero al primer elemento: void desplaza (int a[]); int t1[10]; desplaza(t1); Punteros y cadenas Punteros y estructuras ¿Más preguntas? 33 / 63 Variables por valor y por referencia (2) Contenidos Parte básica de la sintaxis de C Control de flujo 2 Matrices Cadenas 5 Subprogramas Qué es un puntero 8 Tipos de punteros y tablas 11 Punteros y cadenas // Las variables simples, al usar punteros, se pasan por referencia: void intercambia (int* a, int* b) { int x; x=*a; *a=*b; *b=x; } int c,d; intercambia(&c, &d); // Una función puede devolver un puntero, que es un dato simple: char pidecadena () { char * cad; gets(cad); return cad; } Punteros y estructuras ¿Más preguntas? 34 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas 6 Qué es un puntero 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 35 / 63 Basado en... Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Basado en: A TUTORIAL ON POINTERS AND ARRAYS IN C Cadenas Subprogramas Qué es un puntero by Ted Jensen http://pweb.netcom.com/~tjensen/ptr/cpoint.htm Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? 36 / 63 Punteros Contenidos Punteros o apuntadores (pointers): Parte básica de la sintaxis de C Control de flujo int k,j; k=2; j=7; 3 Matrices Cadenas Subprogramas 6 Qué es un puntero Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 9 12 int *ptr; /* p es un puntero a enteros */ // Es decir, contiene una dirección de memoria, y el lenguaje sólo permite que apunte a enteros ptr=NULL; ptr=&k; /* ptr contiene la dirección de memoria de k */ j=*ptr; /* j recibe lo apuntado por ptr, un entero con el valor 2 */ *ptr=7; /* en ese entero se introduce el 7 */ printf("j %d @ %p\n", j, (void *)&j); printf("k %d @ %p\n", k, (void *)&k); printf("ptr %p @ %p\n", ptr, (void*)&ptr); printf(" Apuntado por ptr es %d\n", *ptr); ¿Más preguntas? 37 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas 6 Qué es un puntero 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas El tamaño de los punteros Punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más 38 / 63 El tamaño importa Contenidos Parte básica de la sintaxis de C Control de flujo En C, el tamaño sí que importa. . . Matrices Cadenas 1 Subprogramas Qué es un puntero 4 int *ptr, k; k=7; printf("Tamaño: %d\n", sizeof(int)); *ptr=k; ptr++; // ¿adónde apuntará? Tipos de punteros y tablas El tamaño de los punteros Punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más 39 / 63 Punteros void Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas 1 void *p; Subprogramas Qué es un puntero Tipos de punteros y tablas El tamaño de los punteros Punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más 40 / 63 Punteros y tablas (arrays) Contenidos Parte básica de la sintaxis de C Puntero para recorrer una tabla Control de flujo Matrices 2 Cadenas Subprogramas 5 Qué es un puntero Tipos de punteros y tablas El tamaño de los punteros 8 int tabla[] = {1,23,17,4,-5,100}; int *ptr; int i; ptr = &tabla[0]; /*1*/ ptr = tabla; /*2*/ printf("\n\n"); for (i = 0; i < 6; i++) { /*A*/ printf("tabla[ %d] = %d",i,tabla[i]); /*B*/ printf("ptr + %d = %d\n",i, *(ptr + i)); } Punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más 41 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? 42 / 63 Copia de cadenas con índices Contenidos Parte básica de la sintaxis de C Control de flujo 2 Matrices Cadenas 5 Subprogramas Qué es un puntero 8 Tipos de punteros y tablas 11 char *my_strcpy(char d[], char f[]) { int i=0; while (f[i]!= ’\0’) { d[i] = f[i]; i++; } d[i] = ’\0’; return d; } // *(dest + i) = *(source + i); Punteros y cadenas Punteros y estructuras ¿Más preguntas? 43 / 63 Copia de cadenas con punteros Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas 7 char *my_strcpy(char *d, char *f) { char *p = d; while (*f != ’\0’) *p++ = *f++; *p = ’\0’; return d; } // while (*f) cuando lo apuntado sea 0 es falso Punteros y cadenas Punteros y estructuras ¿Más preguntas? 44 / 63 Cadenas con punteros Contenidos Qué es un puntero 9 Tipos de punteros y tablas 12 #include <stdio.h> #include <string.h> char * nombremes(int n); main() { char *s = "hola"; /* char s[]="hola"; y s[5] */ strcpy(s, "adios"); /* ? s="adios"; que copia el puntero */ printf(" %s",s); s=nombremes(4); printf(" %s",s); } char * nombremes(int n){ static char * nmes[]={"error","en","feb","mar","abr", "mayo","jun","jul","ago","sep","oct","nov","dic"}; 15 } Parte básica de la sintaxis de C 3 Control de flujo Matrices 6 Cadenas Subprogramas Punteros y cadenas Punteros y estructuras return ( (n<1||n>12) ? nmes[0] : nmes[n]); /* if */ ¿Más preguntas? 45 / 63 Cadenas con punteros (2) Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices Cadenas 6 Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas 9 12 int cont_car(char car, char s[]) { int cont=0,i; for (i=0;s[i]!=’\0’;i++) if (s[i]==car) cont++; /* s es un ptr no explícito */ return cont; } cont_car(char car, char *s) { /* devuelve int */ int cont=0; /* implícitamente */ char *p; for (p=s;*p!=’\0’;p++) if (*p==car) cont++; return cont; } Punteros y estructuras ¿Más preguntas? 46 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 47 / 63 Estructuras Contenidos 1 Parte básica de la sintaxis de C Control de flujo 4 Matrices Cadenas 7 struct ficha { char ap[20]; char nom[20]; int edad; float altura; }; struct ficha yo; Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas 10 13 int main(void) { strcpy(yo.ap,"G.N."); strcpy(yo.nom,"P."); printf("\n %s, ",yo.ap); printf(" %s\n",yo.nom); return 0; } Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 48 / 63 Estructuras y punteros Contenidos Parte básica de la sintaxis de C Control de flujo 3 Matrices struct ficha *p; p = &yo; (*p).altura = 1.85; p->altura = 1.85; Cadenas Subprogramas 6 Qué es un puntero 9 Tipos de punteros y tablas void imprime(struct ficha *p) { printf("\n %s, ", p->ap); printf(" %s ", p->nom); printf(" %d\n", p->altura); } Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 49 / 63 Estructuras y malloc Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas 1 struct ficha *p; p = (struct ficha *) malloc(sizeof(struct ficha)); Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 50 / 63 Usando typedef con estructuras y malloc Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas 7 typedef struct { char ap[20]; char nom[20]; int edad; float altura; } Ficha; Ficha *p; p = (Ficha *) malloc(sizeof(Ficha)); Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 51 / 63 Uso alternativo de typedef con estructuras y malloc Contenidos Parte básica de la sintaxis de C Control de flujo 1 Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas 7 struct { char ap[20]; char nom[20]; int edad; float altura; } ficha; typedef struct ficha *FICHA; FICHA p; p = malloc(sizeof(*FICHA)); Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 52 / 63 Tablas de estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas 3 Subprogramas Qué es un puntero 6 #define TAMTABLA 10 FICHA *t; // struct ficha **t; t = malloc(sizeof(FICHA)*TAMTABLA); for (i=0; i<TAMTABLA; i++) { t[i]=malloc(sizeof(*FICHA)); llenaficha(t[i]); } Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 53 / 63 Ejemplo de árbol binario Contenidos 2 Parte básica de la sintaxis de C Control de flujo 5 Matrices Cadenas 8 Subprogramas Qué es un puntero 11 Tipos de punteros y tablas 14 Punteros y cadenas Punteros y estructuras 17 typedef struct node { int value; struct node *leftChild; struct node *rightChild; } node; typedef struct tree { int numNodes; struct node** nodes; } tree; tree *initTree() { /* in C (not C++), don’t have to cast malloc’s return pointer, it’s implicitly converted from void* */ tree* atree = malloc(sizeof(tree)); node* anode = malloc(sizeof(node)); atree->nodes[0] = anode; return atree; } Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 54 / 63 Manejo de ficheros Contenidos Parte básica de la sintaxis de C 1 Control de flujo Matrices Cadenas 4 Subprogramas Qué es un puntero Tipos de punteros y tablas # E/S estándar printf("formato", lista de expresiones); scanf ("formato", lista de expresiones); 7 10 # E/S no estándar fprintf(fich, "formato", lista de expresiones); fscanf (fich, "formato", lista de expresiones); # Conversión en memoria sprintf(cadena, "formato", lista de expresiones); Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 55 / 63 Manejo de ficheros Contenidos Parte básica de la sintaxis de C 2 Control de flujo Matrices 5 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas 8 11 #include <stdio.h> #define EOF (-1) void main() { FILE *entrada, *salida; int i; char ce, cs; entrada= fopen("fich.en","r"); salida = fopen("fich.sa","w"); while((ce=getc(entrada))!=EOF) { cs = (ce>=’A’ && ce<=’Z’ ? ce+32: ce); putc(cs,salida); } } Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 56 / 63 Argumentos del programa Contenidos Parte básica de la sintaxis de C Control de flujo Matrices 2 Cadenas Subprogramas 5 Qué es un puntero Tipos de punteros y tablas 8 #include <stdio.h> void main(int argc, char *argv[]) { int i; printf("\nPrograma: %s\n",argv[0]); for(i=1;i<argc;i++) printf("argumento %d: %s\n",i,argv[i]); } Punteros y cadenas Punteros y estructuras Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 57 / 63 Punteros a funciones Contenidos Punteros a funciones Parte básica de la sintaxis de C 1 #include <stdio.h> Control de flujo Matrices 4 Cadenas Subprogramas Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras 7 10 13 void f1() { printf("a\n"); } void f2() { printf("b\n"); } void f3() { printf("c\n"); } void f4() { printf("d\n"); } Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 58 / 63 Punteros a funciones Contenidos Punteros a funciones Parte básica de la sintaxis de C // def alternativa de la tabla // void (*t[])(void) = {f1, f2, f3, f4}; Control de flujo 3 Matrices Cadenas Subprogramas 6 Qué es un puntero 9 Tipos de punteros y tablas int main() { // tabla de punteros a 4 funciones void ( *t[4] ) (void); int i; t[0]=f1; t[1]=f2; t[2]=f3; t[3]=f4; 12 Punteros y cadenas Punteros y estructuras for (i=0; i<=3; i++) ( *t[i] ) (); 15 } Estructuras Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 59 / 63 Varios Contenidos Parte básica de la sintaxis de C 3 Control de flujo exit(expresión); es como hacer return de todo el programa, es decir, termina el programa y se devuelve el control al SO. Matrices Cadenas Subprogramas 6 Qué es un puntero Tipos de punteros y tablas 9 Punteros y cadenas Punteros y estructuras Estructuras #define TRUE 1 while(1) ? while(TRUE) ? for(;;) Ciclo infinito Las variables globales, si en algún caso son necesarias, se ponen fuera de cualquier par de llaves. 12 int *x[]; array de punteros a enteros char *x()[]; función que devuelve un array de punteros a caracteres (cadenas) char * (*x()) []; función que da punteros a array de cadenas char (* (*x()) [])(); función que da punteros a array de punteros a funciones que devuelven caracteres (*dir)(); Ejecutar el código almacenado en la posición "dir " de memoria Estructuras y punteros Estructuras y malloc Tablas de estructuras Ejemplo de árbol binario 60 / 63 1 Parte básica de la sintaxis de C 2 Control de flujo 3 Matrices 4 Cadenas 5 Subprogramas Tipos de punteros y tablas 6 Qué es un puntero Punteros y cadenas 7 Tipos de punteros y tablas 8 Punteros y cadenas 9 Punteros y estructuras Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas Qué es un puntero Punteros y estructuras ¿Más preguntas? ¿Más preguntas? 61 / 63 ¿Más preguntas? Contenidos Parte básica de la sintaxis de C Control de flujo Matrices Cadenas Subprogramas ¿Más preguntas? Qué es un puntero Tipos de punteros y tablas Punteros y cadenas Punteros y estructuras ¿Más preguntas? ¿Más preguntas? 62 / 63 C para Sistemas Operativos Introducción a los Sistemas Operativos, 2015-2016 Pablo González Nalda Depto. de Lenguajes y Sistemas Informáticos 11 de febrero de 2016 Modificado el 11 de marzo de 2016