PDF de programación - El lenguaje de Programación C

Imágen de pdf El lenguaje de Programación C

El lenguaje de Programación Cgráfica de visualizaciones

Publicado el 22 de Agosto del 2018
698 visualizaciones desde el 22 de Agosto del 2018
130,8 KB
53 paginas
Creado hace 17a (28/03/2007)
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
  • Links de descarga
http://lwp-l.com/pdf13126

Comentarios de: El lenguaje de Programación C (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad