Etudiant
Wurtz Jean-Marie Université Louis Pasteur Wurtz@igbmc.u-strasbg.fr
Les pointeurs en C
•Opérateurs * et &, priorité •Déclaration : type et fonction (define, struct, union)
Mémoire d’un 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 mémoire qui contient la valeur 27 */
Les pointeurs en C : les opérateurs * et &
• • • • int i, j, *ip; i=11; ip= &i; j=21; i 11
Les pointeurs en C : déclaration 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 d’entier → Tableau d’entier → Tableau de pointeurs d’entier → Fonction retournant un pointeur d’entier → Pointeur de fonction retournant un entier
j
21
Ad(i)
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 crée 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 inchangées
a et b échangées
Les pointeurs en C : passage par adresse (3)
•int f3(int a[], int b), « a » passage par adresse : les modifications du tableau « a » seront répercutées au niveau de la fonction appelante. •Une variable définit 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 nœud tn []; struct nœud { int