TD n6 - Correction
Pointeurs
Lors des exercices qui suivent, vous aurez souvent besoin dafficher la valeur dune adresse
memoire. Pour ce faire, vous pouvez utiliser printf avec le format %u.
Certains exercices sont faisables en utilisant les techniques habituelles sur les tableaux. Dans
ce TD, on vous demande plutot de vous entraner `a utiliser larithmetique des pointeurs.
Correction : i vaudra 17 et j 22
Exercice 2 Declarer trois pointeurs p, q, et r pointant respectivement vers des types char, int
et double. Ecrire une boucle pour afficher les valeurs des adresses p, q, r, p+1, q+1, r+1 ... p+9,
q+9, r+9. De combien augmentent les adresses `a chaque tour de boucle ?
Declarer maintenant trois tableaux de taille 10, un tableau de char, un tableau dint et un
tableau de double. Initialiser les pointeurs p, q, et r `a la premi`ere case du tableau correspondant,
et parcourez les tableaux dans une boucle. A chaque tour de boucle, vous incrementerez les
pointeurs. A chaque tour de boucle afficher les valeurs des pointeurs et ladresse de la case
courante du tableau. Observez bien les resultats.
Correction :
void exo2(){
char tchar[10] ;
int tint[10] ;
double tdouble[10] ;
char *p = tchar ;
int *q = tint ;
double *r = tdouble ;
int i ;
for(i = 0 ; i < 10 ; i++)
printf("p: %u q: %u r: %u\n",p+i,q+i,r+i) ;
1
p++;
q++;
r++;
}
}
Observez bien les valeurs des decalages pour chacun des types.
Exercice 3 Expliquer la difference entre les deux fonctions suivantes. Si vous ne voyez pas bien
ou si vous netes pas s
ur de ce qui se passe, nhesitez pas `a les implementer, `a les tester dans un
programme (valeur des param`etres avant et apr`es passage dans les fonctions, valeurs de retour).
Correction :
int main(void){
int n = 0 ;
printf("increment1: %d\n",fonctionIncrement1(n)) ;
printf("n: %d\n",n) ;
printf("increment2: %d\n",fonctionIncrement2(&n)) ;
printf("n: %d\n",n) ;
return 0 ;
}
Ce programme affiche :
increment1: 1
n: 0
increment2: 1
n: 1
Exercice 4 Attention, ca se corse, ici, on melange les notations pointeurs et tableaux. Nhesitez
pas `a implementer et `a faire des dessins pour comprendre ce qui se passe, et `a reprendre cet
exercice au calme demain...
2
Que designent les expressions suivantes :
&tab[0]
*tab
tab[0]
tab[1]
*(tab + 1)
**tab
*tab[0]
**(tab + 1)
*tab[1]
*(tab[2] + 1)
tab[2][1]
Correction : &tab[0] adresse de la case 0 du tableau cest donc la meme adresse que tab
*tab et tab[0] representent tous les deux le contenu de la case 0 du tableau, Un
tab[1] et *(tab + 1) representent tous les deux le contenu de la case 1 du tableau Deux
**tab et *tab[0] representent tous les deux le caract`ere pointe par le contenu de la case 0 du tableau,
le caract`ere U
**(tab + 1) et *tab[1] representent tous les deux le caract`ere pointe par le contenu de la case 1 du
tableau : le caract`ere D
*(tab[2] + 1) et tab[2][1] representent tous les deux le caract`ere r de la chane Trois.
Quelques exercices dimplementation maintenant : vous definirez les chanes comme des poin-
teurs vers le premier caract`ere de la chane, et vous utiliserez larithmetique des pointeurs pour
les parcourir.
Exercice 5 Ecrire une fonction echange qui permet dechanger la valeur de deux entiers. Quel
vont etre les types des param`etres de cette fonction ?
Correction :
Exercice 6 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui calcule la lon-
gueur dune chane de caract`eres.
Correction :
3
Exercice 7 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui calcule le nombre
despaces dans une chane de caract`eres.
Correction :
Exercice 8 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui remplace un
caract`ere par un autre dans une chane.
Correction :
Exercice 9 Et si vous avez dej`a tout fini et compris, vous pouvez reprendre nimporte quels
exercices des TD precedents resolus `a laide de tableaux de caract`eres en utilisant larithmetique
des pointeurs !