C para Sistemas Operativos

Anuncio
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
Descargar