El lenguaje de Programación C
Fernando J. Pereda <
[email protected]>
¿Por qué aprender C?
● Portable y muy extendido
● Estándar (C89, C99)
● El lenguaje de los sistemas
● Un lenguaje fácil (no, no es broma)
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Por qué ignorar C?
●
●
●
●
● En la Universidad enseñan Java
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Hola Mundo
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf(“Hola Mundo!\n”);
return EXIT_SUCCESS;
}
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Variables y funciones
● Zonas de memoria
● Permiten guardar datos
➔Información
➔Código
● Tienen nombre y tipo
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Tipos básicos y arrays
➔short, int, long, float, double
● Numéricos
● Otros
● Muchas variables juntas array
➔char, punteros
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Algunas declaraciones
int a;
/* Un entero sin inicializar */
int b = 3;
/* Un entero inicializado */
int a[34];
/* Un array de 34 enteros */
unsigned long n;
/* Un entero largo sin signo */
unsigned c;
/* Un entero sin signo */
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Hola Mundo – Diseccionado
#include <stdio.h>
#include <stdlib.h>
Incluir funciones externas
Definición de main
int main(int argc, char *argv[])
{
printf(“Hola Mundo!\n”);
return EXIT_SUCCESS;
}
Llamada a una función
Valor devuelto por la función
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Definiciones y declaraciones
● Declarar antes de definir o usar
● Las declaraciones se agrupan en
ficheros cabecera (algo.h)
/*
* Yo soy un comentario
* los compiladores me ignoran
*/
int mivariable; /* declaración */
char una_funcion(int a, long b); /* declaración */
int suma(int a, int b) /* definición Y declaración
{ * de una función que devuelve
return (a + b); * un int y recibe dos int.
} */
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Estructuras de control (I)
if (a == b) {
hacer_algo_inteligente();
} else if (! algo) {
hacer_otra_cosa(b);
} else {
int i;
for (i = 0; i < a; i++) {
switch (f(i)) {
case 1:
/* algo especial */
break;
default:
/* algo común */
break;
}
}
}
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
printf
● Imprimir 'cosas'
➔Similar a System.out.println
printf(“Hola %s\n“, “Mundo”);
int n = 45;
printf(“n = %d\n”, n);
char *cadena = “Blah”;
printf(“Una cadena: %s\n”, cadena);
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Estructuras de datos (I)
● Clave para el éxito de C
● Unen variables de distinto tipo
struct punto {
struct persona {
int x;
int y;
};
char nombre[20];
char dni[10];
};
struct alumno {
char nia[10];
struct persona info_personal;
};
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Estructuras de datos (II)
● Funciones que reciben y devuelven
estructuras
struct punto crear_punto(int x, int y)
{
struct punto p;
p.x = x;
p.y = y;
return p;
}
int coordenada_x(struct punto p)
{
return p.x;
}
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Hemos aprendido
● Declarar variables y funciones
● Definir y llamar funciones
● Controlar el código que se ejecuta
● Crear estructuras de datos
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Cómo funciona todo esto? (I)
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Cómo funciona todo esto? (II)
int a;
a
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Cómo funciona todo esto? (III)
int a;
char c;
a = 456;
0x000001c8
a
c
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Cómo funciona todo esto? (IV)
int a;
char c;
a = 456;
c = 'Z';
0x000001c8
a
c
0x5a
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Cómo funciona todo esto? (V)
● Paso de parámetros por valor (copia)
● No existen 'referencias'
➔¡Las estructuras y los arrays también!
➔Rendimiento pobre
➔Poco flexible
Las funciones no pueden modificar estructuras ni
variables
No se puede 'devolver dos valores'
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Solución
● Que existan los punteros
● Un puntero es un tipo básico más
● Un puntero guarda la dirección de
otra variable o función
int *p1;
char *p2;
struct mi_struct *p3;
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Nuevos operadores
● Obtener dirección: &
● Acceder a lo apuntado: *
int a;
int b;
int *p;
a = 34;
p = &a; /* p apunta a a */
b = *p; /* b vale 34 */
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (I)
int a;
int b;
int *p;
a = 456;
0x000001c8
a
b
p
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (II)
int a;
int b;
int *p;
a = 456;
p = &a;
a
b
p
0x000001c8
0x0000001c
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (III)
int a;
int b;
int *p;
a = 456;
p = &a;
b = *p;
a
b
p
0x000001c8
0x000001c8
0x0000001c
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (IV)
int a;
int b;
int *p;
a = 456;
p = &a;
b = *p;
*p = 3;
a
b
p
0x00000003
0x000001c8
0x0000001c
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (V)
int a;
int b;
int *p;
a = 456;
p = &a;
b = *p;
*p = 3;
int **pd;
pd = &p;
a
b
p
pd
0x00000003
0x000001c8
0x0000001c
0x00000014
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (VI)
int a;
int b;
int *p;
a = 456;
p = &a;
b = *p;
*p = 3;
int **pd;
pd = &p;
*pd = &b;
a
b
p
pd
0x00000003
0x000001c8
0x00000018
0x00000014
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros diseccionados (VII)
int a;
int b;
int *p;
a = 456;
p = &a;
b = *p;
*p = 3;
int **pd;
pd = &p;
*pd = &b;
**pd = 1;
a
b
p
pd
0x00000003
0x00000001
0x00000018
0x00000014
0x0000001c
0x00000018
0x00000014
0x00000010
0x0000000c
0x00000008
0x00000004
0x00000000
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Tamaños
● char <= short <= int <= long
● float <= double
● T* == P*
● El tamaño de una estructura no es la
suma de los tamaños de sus
miembros.
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Algunas consideraciones
● Los punteros son 'baratos'
● Son fuente de dolores de cabeza y
frustraciones
● Dan miedo
➔¡Pero en Java (casi) TODO es un puntero y a
nadie le da miedo!
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Dices que en Java qué? (I)
● Que en Java, un objeto, es un puntero.
public class Punteros {
public static void main(String[] args) {
String a = null;
String b = new String(“Algo”);
boolean iguales = a.equals(b);
}
}
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Dices que en Java qué? (II)
Exception in thread "main" java.lang.NullPointerException
at Punteros.main(Punteros.java:5)
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Segmentation Fault
● Equivalente al nullPointerException
● Se obtiene al acceder a una dirección
no válida (puntero no válido)
● La única forma de evitarlo es ser
capaz de entenderlo (y reproducirlo)
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Segmentation Faults (I)
int main(int argc, char *argv[])
{
int *p = 0;
*p = 23;
return 0;
}
int main(int argc, char *argv[])
{
return *((int *)0);
}
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Dónde viven las variables? (I)
● Globales y estáticas (static)
● Locales
● Registros (register)
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Dónde viven las variables? (II)
Datos
(.data)
Pila
(Stack)
Globales
Estáticas
Locales
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
¿Dónde viven las variables? (III)
● Las variables register no 'tienen'
dirección de memoria.
➔No se pueden obtener punteros a ellas.
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros a variables locales (I)
int main(int argc, char *argv[])
{
int a = 23;
int b;
b = fun(a);
return b;
}
int fun(int n)
{
int c = n;
return 2 * c;
}
fun
main
c
n
argc
argv
a
b
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros a variables locales (II)
int main(int argc, char *argv[])
{
int *p;
int b;
p = f();
b = *p;
return b;
}
int *f(void)
{
int a = 45;
return &a;
}
main
p
b
El lenguaje de Programación C – Copyright © 2007 Fernando J. Pereda
Punteros a variables locales (III)
int main(int
Comentarios de: El lenguaje de Programación C (0)
No hay comentarios