Vous êtes sur la page 1sur 4

Universite Paris 7 C

Bio-Info Annee 2004-2005

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.

Exercice 1 Que valent i et j `a la fin de cette sequence dinstruction :


int i , j , *ip ;
ip = &i ;
i = 22 ;
j = *ip ;
*ip = 17 ;

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) ;

for(i = 0 ; i < 10 ; i++){


printf("&tchar[%d]:%u , p:%u\n",i,&tchar[i],p) ;
printf("&tint[%d]:%u , q:%u\n",i,&tint[i],q) ;
printf("&tdouble[%d]:%u , r:%u\n",i,&tdouble[i],r) ;

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).

int fonctionIncrement1( int n ){


n = n + 1 ;
return n ;
}

int fonctionIncrement2( int * nPtr ){


*nPtr = *nPtr + 1 ;
return *nPtr ;
}

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...

Dans un programme, on trouve les declarations suivantes :

char c1[] = "Un" ;


char c2[] = "Deux" ;
char c3[] = "Trois" ;
char *tab[] = {c1, c2, c3} ;

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 :

void swap(int * nPtr , int *mPtr){


int temp = *nPtr ;
*nPtr = *mPtr ;
*mPtr = temp ;
}

Les param`etres de la fonction sont des pointeurs sur des entiers.

Exercice 6 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui calcule la lon-
gueur dune chane de caract`eres.

Correction :

int longueur(char * chaine){


char * cPtr = chaine ;
while(*cPtr !=\0){
cPtr ++ ;
}
return(cPtr - chaine) ;
}

3
Exercice 7 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui calcule le nombre
despaces dans une chane de caract`eres.

Correction :

int nombreEspaces(char *chaine){


char * cPtr = chaine;
int nb = 0 ;
while(*cPtr !=\0){
if (*cPtr == )
nb++;
cPtr++ ;
}
return nb ;
}

Exercice 8 Ecrire (en utilisant larithmetique des pointeurs) une fonction qui remplace un
caract`ere par un autre dans une chane.

Correction :

void remplace(char vieux , char neuf , char *chaine){


while(*chaine !=\0){
if (*chaine == vieux){
*chaine = neuf ;
}
chaine++;
}
}

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 !