19/02/2013
1
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Bibliografía recomendada
Introducción a la Programación en C. Apuntes de la asignatura
1
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.1 La función main: Hola Mundo
CODIGO FUENTE Archivo de texto *.c
PREPROCESADOR
ARCHIVOS DE CABECERA Archivo de texto *.h
#include <stdio.h>
void main() {
printf("Hola mundo\n"); } ENLAZADOR
(LINKADO)
COMPILADOR
CODIGO FUENTE PREPROCESADO
CODIGO COMPILADOArchivo binario *.obj
LIBRERIAS ESTATICAS Archivo binario *.lib
2
(LINKADO)
EJECUTABLE Archivo binario *.exe
EJECUCION
LIBRERIAS DINAMICAS Archivo binario *.dll
PROGRAMA EJECUTANDOSE
19/02/2013
2
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Ejercicio
Cuáles son los errores?
void main(){
Printf( "Hola mundo/n ); }
• No hay ninguna biblioteca incluida.
• No tiene definida la función Printf
• Printf en lugar de printf
• /n en lugar de \n
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Elementos de C
•Los separadores (espacio en blanco y comentarios).
• Las palabras clave. (el lenguaje en si)
• Los identificadores (los nombres de las cosas)
• Las constantes (valores fijos: 5, 8.3, “hola” )
•Los operadores
#include <stdio.h>
void main() {
int variable=0;variable=5+34; printf("Hola mundo\n");
}
19/02/2013
3
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.2 Comentarios//Comentario en C++/*Comentario en C*// Comentario en C /
Hacer un programa que imprima en pantalla las frases:
Mi nombre es:
Espacio en blanco en CEspacio, saltos de línea, tabuladores, etc… son ignorados por el compilador.
5
Mi nombre es:
Estoy aprendiendo a programar en C.
Incluya un comentario con los siguientes datos:
Fecha:
Programador:
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.3 Identificadores y palabras reservadas•En C hay 32 palabras clave reservadas •El editor las colorea en azul.El editor las colorea en azul.
Modificadores Tipos datos primitivos
Tipos datos avanzados
Control
unsigned void struct ifsigned char enum elseauto short typedef switchregister int union caseextern long default
6
const float forstatic double dovolatile while
sizeof returncontinuebreakgoto
19/02/2013
4
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Identificadores sirven para variables y funcionesIdentificadores sirven para variables y funciones[modificador] <tipo> <identificador> [=valor inicial];
Ejemplos:float dato;int numero;const int c=4;
7
int a=3;
En C siempre al principio de una función
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Sobre Windows:Sobre Windows:
Modificador Tipo Tamaño Rango
(signed) char 1 byte -128 a 127
unsigned char 1 byte 0 a 255
short 2 bytes -32768 a 32767
unsigned short 2 bytes 0 a 65535
8
int 4 bytes -2147483648 a 2147483647
unsigned int 4 bytes 0 a 4294967295
long 4 bytes -2147483648 a 2147483647
unsigned long 4 bytes 0 a 4294967295
float 4 bytes 1.7 e+38 (precisión 7)
double 8 bytes 1.7e+308 (precisión 16)
19/02/2013
5
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Identificadores:Identificadores: • “Nombre simbólico que se refiere
a un dato o a una parte de un programa”
• Asignar nombres a direcciones de memoria: variables y funciones
• Ej: char peso;
0110010135 peso
9
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Identificadores: • Reglas sintaxis:
1. a-z, A-Z, 0-9, ‘_’2. No espacios ni signos de puntuacion3. Primer carácter distinto de 0-94. Distingue mayusculas de minusculas (Masa ≠ masa ≠ MASA ≠
MaSa …)5. Maximo 31 caracteres de longitud (ANSI C)6 N l b l (Ej t)
10
6. No palabras clave (Ej. const)• Reglas “Buen uso”:
1. Utilizar nombres significativos. (Ej. edad vs. e)2. Utilizar variables tipicas en matematicas. (Ej. i,j,k para indices)3. Comenzar las variables por minuscula.
19/02/2013
6
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Identificadores: Ejemplos NO1valor
2_dato
tiempo-total
dólar
Ejemplos SIUnValor
dato2
tiempo_total
dolar
11
continue
%final
mi variable
Dolares$
continuar
porcentaje_final
mi_variable
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Identificadores: PeorDato
MiEdad
contador
Mejoredad, peso, longitud
miEdad, mi_edad
i
12
19/02/2013
7
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Constantes:Datos que no pueden variar en el programa
1. Numéricos 5, 224, 2.23, 5e-32. Caracteres ‘a’, ‘y’3. Cadenas de caracteres “Hola mundo”
13
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Variables y memoria
14
19/02/2013
8
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
Declaración de las variables
15
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
16
Variable Global
#include <stdio.h> int x;
int main() {
}
Variable Local
#include <stdio.h>
int main() {
int x; }
19/02/2013
9
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
17
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.4 Variables y constantes
#include <stdio.h>
int main() {
int x = 10;
printf( "El valor inicial de x es %d\n", x );
x = 50;
printf( "Ahora el valor es %d\n" x );
18
printf( Ahora el valor es %d\n , x );return 0;
}
19/02/2013
10
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.5 Expresiones, sentencias y directivas: el uso de llavesSentencia simple ;Sentencia Compuesta { }Sentencia Compuesta { }Directiva #Una expresión es una combinación de variables constantes y/o operadores. Todas las expresiones tienen valor en C.
La directiva #define para constantes de texto#include <stdio.h>
#define CAJAS 4
#define UNIDADES_POR_CAJA 25
19
_ _
#define PRECIO_POR_UNIDAD 100
#define IMPUESTOS 1.16
int main() {
int precio;
precio = (CAJAS*UNIDADES_POR_CAJA*PRECIO_POR_UNIDAD)*(IMPUESTOS);
printf( "El precio total es: %d", precio );
return 0;
}
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.6 Escritura y lectura con printf y scanf
printf
Esta definida en el fichero stdio.hSirve para mostrar texto por la consola.
printf(<cadena de car>[, par1,par2…]);Se sustituye en la cadena de caracteres, las ocurrencias
de %
%[ancho][precision] tipo
p
Secuencias de escape Si entre “ “ ponemos:
20
%[ ][p ] p%c – carácter%d – entero con signo%i – entero con signo%u – entero sin signo%e – exponencial %f – real%s – cadena de caracteres
Secuencias de escape. Si entre ponemos:\n – retorno de carro\t – tabulacion\b – retrocede un carácter\’ – Comilla simple\” – Comilla doble\\ - Barra invertida
19/02/2013
11
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.6 Escritura y lectura con printf y scanf
scanfEsta definida en el fichero stdio.hPermite capturar la entrada del usuario.
scanf(<cadena de formato>,[ &var1, & var2]);
La especificacion de formato es igual a la del printf. Recordar: Solo entrada del usuario
21
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.7 Los operadoresAritméticos: +,-,*,/,%. Precaución con la división entera o real.Precaución con la división entera o real.Asignaciones compuestas: ++,--,+=,-=,/=,%=,*=#include <stdio.h>
int main() { int a = 2; int b = 3; int c; c = a + b;
printf ( "Resultado = %d\n" c
#include <stdio.h>
int main() {
int x = 5; printf ( "Valor de x = %d\n", x );
x++; printf ( "Valor de x = %d\n" x );
22
printf ( Resultado = %d\n , c );
return 0;}
printf ( Valor de x = %d\n , x ); return 0;
}
19/02/2013
12
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.7 Los operadoresComparación: ==, !=, >, <, >=, <=Lógicos: &&, ||, !Lógicos: &&, ||, !Bitwise: |,&,^,~,>>,<<
#include <stdio.h>
int main() { printf( "El resultado de la operación 235 | 143 es: %d\n", 235 | 143 ); return 0;
}
23
}
El resultado de la operación 235 | 143 es: 239
235 11101011
143 10001111
239 11101111
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.8 Precedencia y asociatividad de operadores() [] . () [] . -->>
-- ~ ! ++ ~ ! ++ ---- (tipo) * & sizeof(tipo) * & sizeof
* / %* / %
+ + --
<< >><< >>
< <= > >=< <= > >=
== !=== !=
&&
24
&&
^̂
||
&&&&||||?:?:= *= /= %= += = *= /= %= += --= <<= >>= &= |= ^== <<= >>= &= |= ^=
19/02/2013
13
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.8 Precedencia y asociatividad de operadores#include <stdio.h> #include <stdio.h>
int main() {
int a, b, c;
a = 5;
b = ++a;
c = ( a + 5 * 2 ) * ( b + 6 / 2 ) + ( a * 2 );
printf( "%d, %d, %d", a, b, c );
}
int main() {
float x = 0, a = 20, b = 10, d = 4;
x = (a - b);--b;x *= (b - d) * b / (b - d);b++;b++;printf("x = %f, b = %f\n", x, b);return 0;
25
#include <stdio.h>
int main() {
int a, c;
a = 5;
c += a +5;
}
}return 0;}
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Clase
2.9 CastingCuando dos tipos diferentes de constantes y/o variables aparecen en una misma expresión relacionadas por un operador, el compilador convierte los p p p pdos operandos al mismo tipo de acuerdo con los rangos, que de mayor a menor se ordenan del siguiente modo:
long double > double > float > unsigned long > long > unsigned int > int > char
Hay otra conversión implicita en las asignaciones
El casting es indicar una conversión de forma explícita:
26
g pPara ello basta preceder la constante, variable o expresión que se desea convertirpor el tipo al que se desea convertir, encerrado entre paréntesis.
k = (int) 1.7 + (int) masa;
19/02/2013
14
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Tema 3. Las sentencias de control3.1. If-else3.2. Switch3.3. While3 4 F3.4. For3.5. Do-while3.6. Bucles anidados3.7. Break y continue
27
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de controlClasificación funcional de las sentencias de control
28
19/02/2013
15
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 SENTENCIA if else
29
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 SENTENCIA if else
30
19/02/2013
16
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 SENTENCIA if else
31
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 SENTENCIA if else
32
19/02/2013
17
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 ANIDAMIENTO DE SENTENCIAS if else
33
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 ANIDAMIENTO DE SENTENCIAS if else
34
19/02/2013
18
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 Construcción else if
35
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.1 Construcción else if
36
19/02/2013
19
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.2 SENTENCIA switch case
37
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.2 SENTENCIA switch case
38
19/02/2013
20
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.2 SENTENCIA switch case
39
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.2 SENTENCIA break en switch case
40
19/02/2013
21
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.3 BUCLE while
41
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.3 BUCLE while
42
19/02/2013
22
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.4 BUCLE for
43
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.4 BUCLE for
44
19/02/2013
23
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.5 BUCLE do while
45
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.5 BUCLE do while
46
19/02/2013
24
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.6 BUCLES anidados
47
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.7 BREAK y CONTINUE
48
19/02/2013
25
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Las sentencias de control
3.7 BREAK y CONTINUE
49
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Tema 4. Tipos avanzados de datos4.1. Vectores4.2. Cadenas de caracteres4.3. Estructuras4 4 V t d t t4.4 Vectores de estructuras4.5 Matrices
50
19/02/2013
26
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 Vectores
Concepto
Declaración de un vector en C
51
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 Vectores
Elementos de un vector
52
19/02/2013
27
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 VectoresEjemplos:
53
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 VectoresInicialización de un vector:
54
19/02/2013
28
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 VectoresRecorrido de un vector:
55
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.1 VectoresEjemplo: leer un vector desde el teclado e imprimirlo en la pantalla
56
19/02/2013
29
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresConcepto de cadena de caracteres en C
Declaración de una cadena de caracteres
57
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresElementos de una Cadena
58
19/02/2013
30
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresInicialización de una Cadena
59
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresRecorrido por los elementos de una cadena
60
19/02/2013
31
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresEjemplo: imprimir una cadena en la pantalla carácter a carácter.
61
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresImprimir una cadena de caracteres con printf.
62
19/02/2013
32
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresLeer una cadena de caracteres con scanf.
63
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.2 Cadenas de caracteresLeer una cadena de caracteres con espacios en blanco: gets().
64
19/02/2013
33
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasConcepto de estructura en C
65
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasConcepto de estructura en C
66
19/02/2013
34
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasPatrón de una estructura
67
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasDeclaración de variables
68
19/02/2013
35
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasDefinición de un nuevo tipo de datos
69
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasAcceso a miembros de una estructura
Operaciones con variables estructura
70
19/02/2013
36
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.3 EstructurasEjemplo: Acceso a miembros de una estructura
71
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.4 Vectores de estructurasVectores de estructuras
-A efectos prácticos las estructuras son como un tipo de datos básico, solo que admite el uso del operador ‘.’, q p
typedef struct{char nombre[50]int matricula;
}ficha;void main{
ficha clase[50];int i;
72
;for(i=0;i<50;i++){
scanf(“%s”, clase[i].nombre);scanf(“%d”, &(clase[i].matricula)
}for(i=0;i<50;i++)printf(“\n%s:%d”,clase[i].nombre, clase[i].matricula);
}
19/02/2013
37
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
4.5 MatricesEn C no hay matrices, sino vectores de vectores
void main{
int m[10][5]; //vector de 10 grupos de 5 enterosint i,j;for(i=0;i<10;i++){
for(j=0;j<5;j++)scanf(“%d”, &(m[i][j]));
}for(i=0;i<10;i++)printf(“\n%d”, m[i][j%5]);
}
73
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Tema 5. Punteros5.1. Punteros, definición y operadores5.2. Operaciones con punteros5.3. Punteros a tipos de datos avanzados5 4 A i ió di á i d i5.4 Asignación dinámica de memoria
74
19/02/2013
38
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
1. El concepto de punteros en CEn memoria solo hay bits organizados en conjuntos.
Una variable indica como hay que leer ese conjunto de bits, para interpretarlos correctamente:
1011 0011
0010 1101
1100 0000
0000 1110int a
75
0000 1110
1010 1001
1101 1100
0010 1010
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
1. El concepto de punteros en CPara poder entender todo lo que hay en la memoria hay que saber dos cosas: donde está un dato, y como hay que leerlo.y y q
La variable a está desde el byte 128 hasta el byte 131.Hay que interpretarlo como un entero de 4 bytes.
… 1011 0011
128 0010 1101
129 1100 0000
130 0000 1110int a
76
130 0000 1110
131 1010 1001
132 1101 1100
… 0010 1010char c
Toda variable está en algún lugar (dirección) y ocupa un número de bytes (tamaño).
19/02/2013
39
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
1. El concepto de punteros en C•En C tenemos el operador & que nos dice la dirección en la que está una variable (la de comienzo).( )
El valor de &a será 129•y tenemos un operador sizeof que nos dice cuanto ocupa un tipo de variable.
El valor de sizeof(int) será 4
… 1011 0011
128 0010 1101
77
129 1100 0000
130 0000 1110
131 1010 1001
132 1101 1100
… 0010 1010
int a
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
1. El concepto de punteros en CDefinición: un puntero es una variable que contiene la dirección de otra variable así como el tipo con el que dicha dirección es interpretada.p q p
Por tanto un puntero también se almacena en memoria (es un numero) y también podemos pedir la dirección en donde está.
… 1011 0011
128 0010 1101
129 1100 0000
130 0000 1110int a
… 1011 0011
221 0010 1101
222 1000 0000
78
130 0000 1110
131 1010 1001
132 1101 1100
… 0010 1010
223 0000 0000
224 0000 0000
225 0000 0000
… 0010 1010
int *p
int *p = &a;
19/02/2013
40
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
1. El concepto de punteros en CLas variables puntero son un tipo de datos derivado de otro básico:
<tipo> *identificador, *identificador,…;
char *pa, *pb, *pc; //crea tres punteros a charchar *pa, pb, pc; //crea un puntero a char y dos char;
79
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
El operador unario * (indirección) aplicado a un puntero accede alEl operador unario (indirección) aplicado a un puntero accede al contenido en memoria y lo interpreta según el tipo basico del puntero.
80
Si p es un puntero, entonces *p es el valor de la variable a la que apunta
19/02/2013
41
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
El operador unario * (indirección) aplicado a un puntero accede alEl operador unario (indirección) aplicado a un puntero accede al contenido en memoria y lo interpreta según el tipo basico del puntero.
81
Si p es un puntero, entonces *p es el valor de la variable a la que apunta
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
Relación entre punteros y vectores:p ySea un vector:
int vector[10];
El nombre de un vector es un puntero constante que apunta al primer elemento del vector.
int *p;p=a; //es lo mismo que escribir a=&(a[0]);
82
vector al ser declarado, apunta a una zona de memoria donde tiene reservado espacio para 10*sizeof(int) bytes (40 bytes)
A un puntero se le puede aplicar el operador [ ] con el mismo efecto que con un vector.
19/02/2013
42
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
Sumar un entero a un puntero:p<puntero>+<int>= dirección + <int>sizeof(tipo del puntero)
Sumar 1 a un puntero es acceder al siguiente elemento del mismo tipo que hay a continuación en la memoria.
int *p;int vector[10];p=a; //es lo mismo que escribir a=&(a[0]);p+1; //es lo mismo que escribir &(a[1]);
4 // l i ibi ( [4])
83
p+4; //es lo mismo que escribir &(a[4]);*(p+4)=10; //es lo mismo que a[4]=10; !!!!
Hacer <puntero>[int] equivale a *(<puntero>+<int>).
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
Sumar un entero a un puntero:p<puntero>+<int>= dirección + <int>sizeof(tipo del puntero)
Sumar 1 a un puntero es acceder al siguiente elemento del mismo tipo que hay a continuación en la memoria.
int *p;int vector[10];p=a; //es lo mismo que escribir a=&(a[0]);p+1; //es lo mismo que escribir &(a[1]);
4 // l i ibi ( [4])
84
p+4; //es lo mismo que escribir &(a[4]);*(p+4)=10; //es lo mismo que a[4]=10; !!!!
Hacer <puntero>[int] equivale a *(<puntero>+<int>).
Restar 1 a un puntero es acceder al elemento anterior del mismo tipo que hay en la memoria
19/02/2013
43
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
Restar un entero a un puntero:p<puntero>-<int>= dirección - <int>sizeof(tipo del puntero)
Restar 1 a un puntero es acceder al elemento anterior del mismo tipo que hay precedente en la memoria.
int *p;int vector[10];p=&(a[5]); p-1; //es lo mismo que escribir &(a[4]);
// itú ( [6])
85
p++; //sitúa p en &(a[6]);*(p-4)=10; //es lo mismo que p[2]=10;
Restar dos punteros del mismo tipo da lugar a un entero igual al numero de elementos que caben entre ambos punteros:
<puntero1> - <puntero2> == (direccion1-direccion2)/sizeof(tipo)
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
2. Operaciones con punteros
86
19/02/2013
44
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include <stdio.h>#include <conio.h>
void main(){
int a;int *p1, *p2;
p1 = &a;p2 = p1;
printf("%p %p",p1,p2);
getch();getch();}
0012FF60 0012FF60
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include <stdio.h>#include <conio.h>
int main(){{
int a;int *b;
a = 10;b = &a;*b += 5;printf( "El valor de a es = %d\n", a );getch();g ();return 0;
}
El valor de a es 15
19/02/2013
45
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include <stdio.h>
int main()
{
Detectar el error:
{
int *a;
*a = 5;
}
Porque no hemos asignado ninguna dirección al puntero. Este puntero puedeq g g p p papuntar a cualquier sitio y al darle un valor estamos escribiendo en un lugar desconocido de la memoria.
Esto puede dar problemas e incluso bloquear el ordenador. Recordemos que al ejecutar un programa éste se copia en la memoria, al escribir en cualquier parte puede que estemos cambiando el programa (en la memoria, no en el disco duro). .
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include “stdio.h”
void main(void){
int a, b, c;, , ;int *p1, *p2;void *p;
p1 = &a; // Paso 1. La dirección de a es asignada a p1*p1 = 1; // Paso 2. p1 (a) es igual a 1. Equivale a a = 1p2 = &b; // Paso 3. La dirección de b es asignada a p2*p2 = 2; // Paso 4. p2 (b) es igual a 2. Equivale a b = 2;p1 = p2; // Paso 5. El valor del p1 = p2*p1 = 0; // Paso 6. b = 0p2 = &c; // Paso 7. La dirección de c es asignada a p2*p2 = 3; // Paso 8. c = 3printf("%d %d %d\n", a, b, c); // Paso 9p = &p2; // Paso 10. p contiene la dirección de p1*p2 = 1; // Paso 12. c = 1printf("%d %d %d\n", a, b, c); // Paso 13.
}
1 0 3
1 0 1
19/02/2013
46
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
3. Punteros a tipos de datos avanzados
Punteros y matricesy
int mat[5][3], **p, *q;
El nombre de la matriz es un puntero al primer elemento de un vector de punteros a bloques de 3 enteros mat
El nombre mat es pues un puntero a puntero. Sin embargomat != &(mat[0][0])
a pesar de apuntar al mismo lugar, porque el tipo del puntero es distinto
91
El nombre mat[1] es pues un puntero a un entero (al primer entero del segundo vector de la matriz). Es decir mat[1] == &(mat[1][0])
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
Punteros
3. Punteros a tipos de datos avanzados
Punteros y matricesyHaciendo
int **p = mat; se tendrán las siguientes formas de acceder a los elementos de la matriz:
*p = mat[0]
**p = mat[0][0]
*(p+1) = mat[1]
92
(p ) [ ]
**(p+1) = mat[1][0]
*(*(p+1)+1) = mat[1][1]
19/02/2013
47
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
PunterosAsignación dinámica de memoria
• Cuando definimos un vector con un tamaño definido, podemos tener dosposibles casos, uno es un desaprovechamiento de la memoria y otro es lafalta de espacio.
• Dada la equivalencia entre vectores y punteros podría interesar poderdefinir:
int *x;Y luego decidir cuanto elementos guardaremos en lugar de tener queponer una constante en el vector:poner una constante en el vector:
int x[10];
• Sobre todo si no conocemos el tamaño de manera predeterminada.
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
PunterosAsignación dinámica de memoria
• Durante la ejecución se puede solicitar un espacio de memoria por mediode la función malloc (stdlib.h).int *x;x= (int *)malloc(10*sizeof(int));
• En este caso solicitamos espacio para almacenar 10 veces lo que ocupa unentero.
• En general el <<cast>> de tipo que procede a malloc debe ser consistenteEn general el <<cast>> de tipo que procede a malloc debe ser consistentecon el tipo de datos de la variable puntero.
• Así si quisiéramos pedir en tiempo de ejecución para diez variables tipodouble sería:
y=(double *)malloc(10*sizeof(double));
19/02/2013
48
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
PunterosAsignación dinámica de memoria: ejemplo
int i,n,*x;int i,n, x;….printf(“¿Cuántos números serán introducidos?\”);scanf(“%d”,&n);/* reserva de memoria para n enteros */x=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++){i tf( “i %d “ i 1)printf( “i=%d x=“, i+1);
scanf(“%d”,x+i);}
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
PunterosAsignación dinámica de memoria
La función malloc (Memory allocate) reserva una parte de la memoria y devuelve la dirección del comienzo de esa parte. Esta dirección se almacena en un puntero y así podemos acceder a la memoria reservada.
Si fracasa, retornará NULL. Por ejemplo porque no hay memoria suficiente.
El cast es necesario por la generalidad de malloc. Esta función retorna un d l h l i ió i h l
puntero = (tipo_de_variable *) malloc( cantidad de bytes a reservar );
puntero a nada, por lo que para hacer la asignación es necesario hacer la conversión explícita.
Cuando ya no necesitemos más el espacio reservado debemos liberarlo. Si no liberamos el espacio que ya no necesitamos corremos el peligro de agotar la memoria del ordenador. Para ello usamos la función free, que funciona de la siguiente manera:
19/02/2013
49
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
PunterosLiberación de memoria
Cuando ya no necesitemos más el espacio reservado debemos liberarlo. Si no liberamos el espacio que ya no necesitamos corremos el peligro de agotar la memoria del ordenador. Para ello usamos la función free, que funciona de la siguiente manera:
IMPORTANTE: da error si el puntero apunta a una zona ya liberada o no reservada con malloc. El ordenador ya sabe cuanto tiene que liberar en
free( puntero );
reservada con malloc. l ordenador ya sabe cuanto tiene que liberar enese bloque.
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include <stdio.h>
#include “malloc.h”
void main() {
int b;
char *texto;
printf("Cuantos bytes quieres reservar: ");
scanf("%d",&b);
texto = (char *) malloc(b);
/* Comprobamos si ha tenido éxito la operación */
if (texto != NULL) {
i tf("M i d %i b t \ " b t )printf("Memoria reservada: %i bytes\n", bytes);
printf("El bloque comienza en la dirección: %p\n", texto);
/* Ahora liberamos la memoria */
free( texto );
} else
printf("No se ha podido reservar memoria\n"); }
19/02/2013
50
TEMA: Introducción a la programación CFECHA: Febrero de 2013Profesor: Miguel Hernando Gutiérrez
#include "stdio.h"#include “stdlib.h"#include "conio.h"
void main(){{
int *ip, i;
ip = (int *) malloc(5 * sizeof(int) );
printf(“introduzca elementos\n");
for (i=0; i<5; i++)for (i 0; i<5; i++) scanf("%d",(ip+i));
printf(“%d”,ip[4]);free(ip);getch();
}