Académique Documents
Professionnel Documents
Culture Documents
Algorithmique et Langage C
www.polytech.unice.fr/~vg/fr/enseignement/xidian
Sommaire
2 Expressions 14 Pointeurs
2 Routines
2 Énoncés Itératifs
2/233
Algorithmique et Langage C
Pointeurs
Les Pointeurs
148/233
Algorithmique et Langage C
Pointeurs
Pointeurs
Définition
un pointeur est une adresse qui désigne une valeur en mémoire.
l’accès à la valeur pointée se fait de façon indirecte.
p 125.38
dans les langages typés (e.g. C) le type d’un pointeur est fonction du
type des valeurs pointées. On parlera, par exemple, de pointeurs sur
réels.
dans les langages modernes (e.g. Java), mais aussi dans les langages
fonctionnels (e.g. Lisp), la notion de pointeur disparaît.
149/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
les bases
déclaration : T *p (e.g. double *p)
les pointeurs sont typés ⇒ compatibilité obligatoire pour l’affectation !
Conversions
implicite pour n’importe quel pointeur avec void *
pour les autres une conversion explicite est nécessaire
#define NULL ((void *) 0) //dans <stddef.h>
En C les pointeurs sont très utilisés. les programmes sont :
plus compacts
plus efficaces
mais bien moins lisibles
et sujets à plus d’erreurs
150/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
Exemples de déclarations
151/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
Opérations de bases
* indirection (déréférencement)
& adresse de (référencement)
pi i j q
i = 10; 10
pi = &i; 10
j = *pi; 10 10
(*pi)++; 11 10
q = pi; 11 10
}
152/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
153/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
T *p, *q;
∆ ∆ ∆ = sizeof(T)
0 max
q−p // = 5
154/233
Algorithmique et Langage C
Pointeurs
Pointeurs en C
Exemples de déclarations
Pointeur constant. Doit être initialisé à la déclaration
i n t * c o n s t pconst = &x;
Pointeur sur un objet constant. L’objet ne peut être modifié par l’intermédiaire
du pointeur
c o n s t i n t *pconst;
155/233
Algorithmique et Langage C
Pointeurs
FAUX OK
156/233
Algorithmique et Langage C
Pointeurs
Pointeurs et tableaux
pointeurs et tableaux sont des notions très proches
un tableau est un pointeur constant sur le premier élément du tableau.
t[i] ⇔ *(t+i)
t[i][j] ⇔ *(*(t+i)+j)
i n t *p, t[8];
char *s = "hello";
p = t;
p = &t[0]; //idem
/*
t[2]==*(t+2)==*(p+2)==p[2]
s[2]==*(s+2)==*("hello"+2)=="hello"[2]
*/
157/233
Algorithmique et Langage C
Pointeurs
char *p = "hello"; p h e l l o \0
p++; //OK
t++; //KO
158/233
Algorithmique et Langage C
Pointeurs
Tableau en paramètre
Un tableau est un pointeur. Il n’y a pas de copie des éléments du
tableau !
C’est l’adresse du tableau qui est tramsise par valeur !
159/233
Algorithmique et Langage C
Pointeurs
v o i d reset( d o u b l e mat[][N], c o n s t i n t m, c o n s t i n t n) {
f o r ( i n t i=0; i<m; i++)
f o r ( i n t j=0; j<n; j++)
mat[i][j] = 0.0;
}
v o i d reset( d o u b l e mat[], c o n s t i n t m, c o n s t i n t n) {
f o r ( i n t i=0; i<m; i++)
f o r ( i n t j=0; j<n; j++)
mat[i*n+j] = 0.0; //idem mat[i][j] = 0.0;
}
v o i d reset( d o u b l e *mat, c o n s t i n t m, c o n s t i n t n) {
f o r ( i n t i=0; i<m; i++)
f o r ( i n t j=0; j<n; j++)
*(mat + (i*n+j)) = 0.0; //idem mat[i][j] = 0.0;
}
160/233
Algorithmique et Langage C
Pointeurs
strlen strcpy
/* /*
* Rôle : renvoie la longueur de * Rôle : affecte la chaîne s2
* la chaîne de caractères s * à s1 (i.e. s1 = s2)
*/ */
i n t strlen( c o n s t char *s) char *strcpy(char *s1, c o n s t char *s2)
{ {
char *p = s; char *p = s1;
161/233
Algorithmique et Langage C
Pointeurs
Paramètres programmes
le support d’exécution peut transmettre à la fonction main deux (ou
trois) paramètres au démarrage du programme pour accéder aux
paramètres du programmes
argc est le nombre de paramètres programme et argv contient tous les
paramètres
argc == 4
i n t main( i n t argc, char *argv[])
argv[0] m y p r o g \0
{ .... }
argv[1] − o p t \0
argv[2] 1 2 5 \0
% myprog -opt 125 file argv[3] f i l e \0
NULL
162/233
Algorithmique et Langage C
Pointeurs
163/233
Algorithmique et Langage C
Pointeurs
Pointeurs et structures
s t r u c t complexe {
d o u b l e préelle;
d o u b l e pimg;
} *c; //c pointeur sur struct complexe
Accès à un champ
(*c).préelle
(*c).pimg
164/233
Algorithmique et Langage C
Pointeurs
Pointeurs et structures
Une structure ne peut pas s’auto-référencer, c’est-à-dire être récursive,
et donc posséder un champ de son propre type.
Les déclarations de types récursifs utilisent les pointeurs
s t r u c t noeud {
i n t item;
s t r u c t noeud *next;
} *l;
165/233
Algorithmique et Langage C
Pointeurs
tas
166/233
Algorithmique et Langage C
Pointeurs
Allocation dynamique
la bibliothèque standard libc propose plusieurs fonctions
Fonctions
# i n c l u d e <stdlib.h>
v o i d *malloc(size_t size);
v o i d *calloc(size_t nbelems, size_t size);
v o i d *realloc( v o i d *ptr, size_t new_size);
167/233
Algorithmique et Langage C
Pointeurs
Allocation dynamique
tas
5
168/233
Algorithmique et Langage C
Pointeurs
Désallocation
pour libérer de l’espace mémoire alloué dans le tas
Fonction
# i n c l u d e <stdlib.h>
v o i d free( v o i d *ptr);
169/233
Algorithmique et Langage C
Pointeurs
Exemple
Ce petit exemple met en évidence les problèmes rencontrés lorsqu’on
laisse au programmeur la gestion de la désallocation de la mémoire
i n t *p, *q;
p = malloc( s i z e o f ( i n t ));
p q
*p = 15;
15
q = p;
printf("*q=%d\n", *q); //15
free(q);
printf("*p=%d\n", *p); //????
170/233
Algorithmique et Langage C
Pointeurs
Structures dynamiques
pour l’implémentation de structures des données (liste, arbres, ...)
intérêts vs tableaux : pas de taille max, taille de la structure
proportionnelle au nombre d’élements
par exemple : la liste l = <15, −7, 52> pourra être représentée par
la structure simplement chaînée :
next
l 15 −7 52
item
NULL
171/233
Algorithmique et Langage C
Pointeurs
Structures dynamiques
une structure simplement chaînée
172/233
Algorithmique et Langage C
Pointeurs
173/233
Algorithmique et Langage C
Pointeurs
/*
* Antécédent: a⩽b et n>1
* Rôle : calcule l’aire de la fonction continue f surl’intervalle[a,b]
* Algorithme : méthode des rectangles,n est le nb de rectangles calculés
*/
d o u b l e aire( c o n s t d o u b l e a, c o n s t d o u b l e b, c o n s t i n t n,
d o u b l e (*f)( c o n s t d o u b l e ))
{
assert(a<=b);
d o u b l e largeurRect=(b−a)/n;
d o u b l e x=a+largeurRect/2;
d o u b l e aire=0;
d o u b l e f1( c o n s t d o u b l e x) { r e t u r n cos(x)+x; }
d o u b l e f2( c o n s t d o u b l e x) { r e t u r n x; }
i n t main( v o i d ) {
printf("aire=%f\n", aire(0, M_PI/2, 1000, f1));
printf("aire=%f\n", aire(2, 3, 1000, f2));
r e t u r n EXIT_SUCCESS;
}
175/233
Algorithmique et Langage C
Pointeurs
# d e f i n e MAX 100
i n t main( v o i d ) {
i n t i=0, t[MAX];
w h i l e (i++<3) sort(t, sort_tab[i]);
r e t u r n EXIT_SUCCESS;
}
176/233