Vous êtes sur la page 1sur 5

Algorithme et Structures de Donnes

Wurtz Jean-Marie Universit Louis Pasteur Wurtz@igbmc.u-strasbg.fr

Les pointeurs en C
Oprateurs * et &, priorit Dclaration : type et fonction (define, struct, union)

Mmoire dun ordinateur


Adresse

27
Tableaux et pointeurs, initialisation Passage par adresse : scanf Retour des fonctions : struct, union, fonction Allocation dynamique i=27 pi = adresse(i); /* adresse de la cellule mmoire qui contient la valeur 27 */

Les pointeurs en C : les oprateurs * et &


int i, j, *ip; i=11; ip= &i; j=21;
i
11

Les pointeurs en C : dclaration de types


ip Priorit : * < [] < () int i int *pi int **ppi int it[] int *pit[] int *if() int (*ipf)() Un entier Pointeur vers un entier Pointeur de pointeur dentier Tableau dentier Tableau de pointeurs dentier Fonction retournant un pointeur dentier Pointeur de fonction retournant un entier

j
21

Ad(i)

j
21

ip
Ad(i)

*ip=j;

21

Les pointeurs en C : passage par adresse (1)


passage par valeur , int f1(int a, int b) : la fonction f1 cre une copie des variables a et b passage par adresse, int f2(int *a, int *b) : la fonction f2 peut modifier le contenu des variables a et b de la fonction appelante

Les pointeurs en C : passage par adresse (2)


void echange(int a, int b) { int tmp; tmp = a; a = b; b = tmp; } a =11; b = 27; echange(a,b); } a =11; b = 27; echange(&a,&b); void echange(int *a, int* b) { int tmp; tmp = *a; *a = *b; *b = tmp;

a et b inchanges

a et b changes

Les pointeurs en C : passage par adresse (3)


int f3(int a[], int b), a passage par adresse : les modifications du tableau a seront rpercutes au niveau de la fonction appelante. Une variable dfinit comme un tableau est transmise comme un pointeur : a[n] == *(a+n)
enum/sizeof

Les pointeurs en C : les tableaux


i i+1

int ti[]; double td[]; char tc[]; struct nud tn []; struct nud { int i; struct nud *s; }
TD/sizeof.c

t[i] = *(t+i)

Les pointeurs en C ne sont pas des entiers


Si p est un pointeur : int *p, i; p++ : pointe sur llment suivant, p+ = i : pointe sur le ime lment suivant, incrmente daprs la taille de llment Diffrence entre pointeurs, mais pas daddition Si t est un tableau : int t[100], *p; p = &t[0] est correcte, de mme p = t mais pas t = p ou t++ ou p = &t

Les pointeurs en C : struct et union


struct nud { int val; struct nud *s; } n, *pn; union uni { int i; double d; } u, *pu;

Les seules oprations possibles : -prendre ladresse avec & : pn = &n -accder une valeur : n.val = 11 ou pn->val = 11 ou *pn.val = 11

Les pointeurs en C : retour de fonction


Une fonction peut retourner : des types simples : char, short, int, unsigned, long, double ou un pointeur vers un tel type Une fonction ne peut retourner que des pointeurs de fonction, struct ou union Pas de valeur retourne :
void uneFonction()

Les pointeurs en C : les fonctions


int uneFonction(), (*pf)() : -adresse de la fonction: pf = uneFonction -excuter la fonction : (*pf)() Un pointeur de fonction : -nest pas une variable -peut-tre assign un tableau

Les pointeurs en C : les fonctions (2)


int main() { /* un pointeur de fonction retournant un entier */ int (*pf)(); /* un tableau de pointeurs de fonction retournant un entier */ int (*tpf1[10])(); int (*tpf1)())[]; Faux /* un tableau de pointeurs de fonction retournant un entier */ typedef int (*pF)(); pF tpf[10]; struct donne { hello(1); pf = hello2; (*pf)(); tpf[0] = hello3; (*tpf[0])(); tpf1[0] = hello4; (*tpf1[0])(); } TD/ptrfontion.c.html } } switch obj.type { RECT CERCLE POLY int type;

Exemple
object *pObjet;

(*affiche[obj.type])(pObjet);

Les pointeurs en C : conversion de pointeurs (2)


Dfinition de type :
typedef ENTIER int; typedef ptrENTIER *int;

Les pointeurs en C : allocation dynamique


void* calloc(n,sizeof(Type)) : alloue un espace de taille sizeof(Type) et cela n fois void * malloc(n) : alloue un espace de n octets

Fonction scanf (contrle, arg1, arg2, ..) : lecture standard (stdin); sscanf, fscanf
char *str="25 annes 15.3" ; int i; double f; sscanf(str, "%d %*s %f" , &i,&f)

Les pointeurs en C : allocation dynamique (2)


void *realloc(p, n) : libre lespace allou p, et ralloue n octets void free(p) : libre lespace allou

Les pointeurs en C : conversion de pointeurs


Les fonctions dallocation despace retourne un pointeur de void qui pointe sur lespace allou Conversion de type :
pType = (Type *)malloc(n*sizeof(Type))

Exercice 1: malloc et free


#include <stdio.h> #include <stdlib.h> #include <string.h> Saisir la taille de la zone : taille Si > 0 alors Saisir la chaine Vrifier la taille : taille < longueur ! erreur Afficher la chaine Librer l'espace int strlen() void * malloc(n) void free(p)

Exercice 2 : tableau, avec allocation dynamique de la taille


TD/TD1-tableau1.c #define BLOC 2 Variables globales : int compteur=0, taille=0; int *tableau; Fonctions : int inserer(int i) int inserer(int i) -taille du tableau suffisant ? : realloc -insrerl'entier comme avant #include <stdio.h> #include <stdlib.h>

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz

pointeur/allocation.c

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz

pointeur/tableau1_malloc.c

Exercice 3 : tableau de chane de caractres


TD/TD1-tableau1.c #define BLOC 2 Variables globales : int taille=0, compteur=0; char *tableau[]; Fonctions : int inserer(char *s) void afficher() int supprimer(char *s) free() #include <stdio.h> #include <stdlib.h> #include <string.h> int inserer(char *s) -taille du tableau suffisant ? : malloc, realloc -insrer la chane s : malloc

Exercice 3 : tableau de chane de caractres (2)


int main() { char t[20]; strcpy(t, "Marie"); inserer(t); strcpy(t, "Robert"); inserer(t); strcpy(t, "Anne"); inserer(t); inserer("Albert"); inserer("Yann"); inserer("Rose"); inserer("Myriam"); affiche(); }

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz

pointeur/tableau1-char-malloc.c

Crer une structure de donnes dcrivant un point


un point a 2 composantes : x et y Utilisation de typedef Description en C? typedef struct Point { struct Point { double x, y; double x, y; } TPoint; } Dfinition d'une variable Point TPoint pnt = {1.5,3.0}; struct Point pnt = {1.5,3.0}; TPoint p1, *p2; struct Point p1, *p2; // accs aux champs x et y de pnt p1 = pnt; // tester cette assignation p2 = &pnt; // comment accder les //champs x et y de p2

Dcrire des formes gomtriques


Un cercle : son centre et le rayon un carr : son centre et le cot un rectangle : son centre et la hauteur et la largeur un polygone : un nombre quelconque de points ( > 3) avec comme centre le centre de masse des points Dcrire les structures de donnes et les fonctions d'initialisation :

//une variable cercle struct Cercle { //et un pointeur de cercle struct Point c; // le centre double r; // le rayon Struct Cercle ce, *pce; } struct Cercle * crerCercle(struct Point *c, double r)

Dcrire un type Cercle


Un cercle : son centre et le rayon
//une variable cercle struct Cercle { struct Point c; // le centre //et un pointeur de cercle double r; // le rayon Struct Cercle ce, *pce; } struct Cercle * crerCercle(struct Point *c, double r)

Dcrire un polygone
#define POLYGONE 3 typedef struct Polygone { TPoint centre; //le centre de masse int taille; // nbre de points TPoint *poly; //la liste des points } TPolygone; TPolygone * creerPolygone(TPoint tp[], int taille) void affPolygone(TPolygone *po)

#define CERCLE 0 typedef struct Cercle { TPoint centre; // le centre double rayon; // le rayon } TCercle; TCercle * crerCercle(TPoint *c, double r)

//une variable cercle //et un pointeur de cercle TCercle ce, *pce;

Grer une liste de forme gomtrique


Stocker ces formes dans un tableau : struct Forme tabForm[]; struct Forme {????} Remplir le tableau forme un cercle, carr, un rectangle et un polygone Puis lister pour chaque lment du tableau son type, un nom, et ses attributs
crire une fonction afficheCercle(struct Cercle * pc)

Grer une liste de forme gomtrique(2)


puis dfinir un type forme quelconque qui aura comme membres :
un type : le type de l'objet un pointeur vers une des forme gomtrique