Académique Documents
Professionnel Documents
Culture Documents
Temario
Declaracin de punteros
Inicializacin de punteros
Arrays de punteros vs
punteros a arrays
Puntero NULL
Punteros a matrices
Punteros a funciones
Punteros constantes y a
constantes
Punteros a punteros
malloc(), free()
Punteros void*
Memoria dinmica
Comparacin de punteros
Arrays y punteros
Punteros restrict
Punteros a uniones y
estructuras
Punteros
Los punteros son un tipo de dato que guarda
direcciones
de
memoria
(de
variables,
constantes, funciones, etc)
int* x;
int *x, y;
int* x, y;
Tutorial
Un tutorial sobre punteros recomendado es:
Ted Jensen's Tutorial on Pointers and Arrays in C
http://home.earthlink.net/~momotuk/pointers.pdf
NOTA: este es un buen tutorial, sin embargo el nico
defecto que le veo es que no nombra el comando free()
cuando se utiliza malloc().
Declaracin de punteros
Se hace especificando el tipo de dato para el cual
se guardar la direccin de memoria y un nombre
para la variable:
Estas tres declaraciones
son equivalentes.
Inicializacin de punteros
Evite utilizar punteros que no han sido
inicializados a una direccin de memoria
conocida, ya que estos pueden hacer fallar el
programa
NULL
10
11
12
13
Tomado de:
http://www.c4learn.com/illegal-arithmetic-operations-with-pointer.html
14
Resta de punteros
S est definida. Para ello se define el tipo de
datos ptrdiff_t el cual se encuentra declarado
en stddef.h
Ver:
http://pubs.opengroup.org/onlinepubs/7908799/x
http://www.viva64.com/en/a/0050/
http://www.keil.com/support/man/docs/c166/c166
http://stackoverflow.com/questions/7956763/varia
15
http://www.gnu.org/software/libc/manual/html_no
Punteros constantes
Aqu p es un puntero que no se le puede cambiar
la direccin de memoria a la que se est
refiriendo. Se define nicamente en su
declaracin y posteriormente no se le puede
apuntar a otra variable.
16
Punteros constantes
Observe que el compilador dice que "p" es una
variable de solo lectura, esto quiere decir que no
podemos cambiar su contenido.
17
Punteros a constantes
En este caso, p apunta a una variable, pero la trata
como una constante (variable de solo lectura), por lo
que no se puede utilizar el operador * para cambiar el
contenido de la variable a la que apuntamos. Esto nos
sirve para pasar matrices por valor, no por referencia
(comportamiento por defecto).
18
Punteros a constantes
19
20
21
Punteros void
Un puntero void es un puntero genrico, ya que
puede apuntar a cualquier direccin de memoria
y/o a cualquier tipo de dato. Se declara como un
puntero normal, pero con un tipo void *:
void *p; // puntero void o puntero genrico
Tenga en cuenta que:
void *f;
void f();
void f[];
void f;
es un comando vlido
es un comando vlido
es un comando errneo
es un comando errneo
Para acceder
al contenido de
la memoria
apuntado por
el puntero void
se debe utilizar
el operador *,
junto con un
casting que
indique el tipo
que se espera
leer.
Comparacin
de punteros
Los punteros se
pueden comparar
utilizando == o !=
para verificar si
estos apuntan a la
misma direccin
de memoria o no.
25
Punteros y arrays
El decir x[i] es equivalente a decir *(x+i). De
hecho x solo es la direccin de memoria del
primer elemento del array, es decir &(x[0]).
La relacin entre arrays multidimensionales y
punteros es array[i][j] == *(array + i*NCOL + j)
26
Punteros a uniones
27
Punteros a estructuras
28
Arrays de punteros
Es diferente que:
int (*vec)[3];
(puntero a un vector de
3 elementos enteros)
29
Arrays de punteros vs
punteros a arrays
30
Puntero a
matriz
31
Punteros a funciones
Para obtener la direccin de memoria de una
funcin se puede hacer lo siguiente:
32
BUSCAR ...
ff es un puntero a
una funcin que
retorna un double y
que tiene tres
argumentos: 1)
puntero a una
funcin que recibe
un double y devuelve
un double, 2) un
double y 3) otro
double
34
Puntero a puntero
35
Puntero a puntero
36
37
Regla de la espiral
Nota: el * tiene menor precedencia que [] y ()
*
()
[]
[][]
puntero a
funcin que retorna
array de
matriz de
38
*
()
[]
[][]
puntero a ***
funcin que recibe *** y que retorna ***
array de ***
matriz de *** Nota: el * tiene menor precedencia que [] y ()
39
Regla de la espiral
40
Regla de la espiral
41
42
43
#include <stdlib.h>
void *malloc(size_t tam);
malloc() solicita tam bytes del montn y retorna
un puntero a dicho bloque de memoria. La
memoria no se borra. Si el tam==0, entonces
malloc() retorna NULL. Si no se pudo asignar el
bloque de memoria malloc() retorna NULL.
45
#include <stdlib.h>
void free(void *p);
free() libera el espacio de memoria al que apunta
p y que fue asignado previamente del montn con
malloc(), calloc() or realloc(). Si se libera un
puntero que no fue asignado previamente,
entonces el programa falla. Si p==NULL no se
hace nada. Se aconseja como buena prctica de
programacin asignarle al puntero un NULL
despus de haber llamado a free(); esto con el
objeto de evitar posibles errores difciles de
encontrar en el cdigo.
46
#include <stdlib.h>
void *calloc(size_t n, size_t tam);
calloc() solicita n*tam bytes del montn y retorna
un puntero a dicho bloque de memoria. La
memoria se inicializa a 0. Si n==0 o tam==0,
entonces calloc() retorna NULL. Si no se pudo
asignar el bloque de memoria calloc() retorna
NULL. (n: nmero de elementos, tam: tamao de
cada elemento)
Use preferiblemente malloc() a no ser que en
verdad requiera inicializar la memoria en 0, ya
que el borrado toma tiempo.
47
#include <stdlib.h>
void *realloc(void *p, size_t tam);
realloc() reasigna el tamao del bloque de
memoria al que apunta p a tam bytes. En caso
que se requiera ms memoria, los contenidos
anteriores sern copiados, la memoria nueva no
se inicializar a cero y la memoria vieja ser
liberada.
Se asume que el puntero p fue devuelto
previamente por malloc(), calloc() o realloc(). Si
p==NULL
el
comando
funciona
como
malloc(tam). Si tam==0, el comando es
equivalente a free(p).
48
x existe en la
memoria de pila
x existe en la
memoria del montn
49
Por lo tanto:
x[0]
x[1]
x[2]
x[N-1]
==
==
==
==
*(x+0)
*(x+1)
*(x+2)
*(x+N-1)
50
51
52
Error!!!
Lo correcto es:
*((int *)A + i)
El casting se debe hacer porque
A es un puntero a un array de
punteros, es decir cada
elemento de A es del tipo int
[4]. La aritmtica de punteros
solo funciona si A es un puntero
int *
53
Tamao de aquello a lo
que apunta el puntero A
54
Punteros restrict
http://en.wikipedia.org/wiki/Restrict
Ejemplo
En la WIKI hay unos ejemplos que usan restrict.
No los pongo aqu porque no se refleja en verdad
que su uso haga el programa ms rpido.
Pregunt en comp.lang.c y nadie me di
respuesta de ese comportamiento.
https://groups.google.com/forum/?fromgroups=#!topicsearchin/comp.lang.c/restrict/comp.lang.
57
#include <string.h>
void *memcpy(void * restrict dest, const void * restrict orig, size_t n);
memcpy() copia n
bytes que
empiezan en la
direccin de
memoria orig al
bloque de
memoria que
empieza en la
direccin de
memoria dest.
Las reas no se
pueden traslapar.
Si las reas se
traslapan, use
memmove().
memcpy() retorna
un puntero a dest
Puntero a
constante
58
#include <string.h>
void *memcpy(void * restrict dest, const void * restrict orig, size_t n);
59
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);
memmove() copia n bytes desde la direccin de memoria
que empieza en orig hacia el bloque de memoria que
empieza en dest.
El procedimiento primero realiza una copia del bloque
que empieza en orig a un rea temporal de memoria que
no se traslapa con orig o con dest. Luego esta
informacin se copia a dest.
memmove() retorna un puntero a dest
60
61
62
#include <string.h>
void *memset(void *s, int c, size_t n);
memset() llena la
memoria con los
primeros n bytes
de memoria del
rea a la que
apunta s con la
constante (byte)
especificado por
c.
memset() retorna
el puntero s.
63
Era mejor
llamar a
calloc()
64
65
67
Fuente: http://xkcd.com/371/
Ver: http://en.wikipedia.org/wiki/Dangling_pointer
68
Valgrind
http://valgrind.org/
http://en.wikipedia.org/wiki/Valgrind
Fugas de memoria.
etc.
69
Valgrind
http://www.youtube.com/watch?v=h8sgNW0IxtQ
http://www.youtube.com/watch?v=7xJuBqhlChE
http://www.youtube.com/watch?v=fvTsFjDuag8
http://www.youtube.com/watch?v=aDKpqq7EYqQ
70
http://code.google.com/p/drmemory/
http://latedev.wordpress.com/2012/05/19/valgrind
http://stackoverflow.com/questions/413477/is-the
http://en.wikipedia.org/wiki/Dynamic_program_an
71
72