Exercice 1
En traitant des tableaux à l’aide de pointeurs, nous utilisons souvent des expressions de la forme :
for (P=A ; P<A+N ; P++) | ou | for (P=CH ; *P ; P++) |
{ | { | |
... | ... | |
} | } |
ou les versions analogues avec while.
Dans ces boucles, le pointeur P est incrémenté à la fin du bloc d’instruction et comparé ensuite à la condition de la boucle. Au moment où la condition est remplie, P pointe déjà à l’extérieur du tableau; plus précisément sur le premier élément derrière le tableau.
Exemple:
#include <stdio.h> main() { /* Déclarations */ int A[10]; /* tableau */ int *P; /* pointeur dans A */ /* Saisie des données */ printf("Introduire 10 entiers : \n"); for (P=A; P<A+10; P++) scanf("%d", P); /* Affichage du tableau */ printf("Tableau donné A :\n"); for (P=A; P<A+10; P++) printf("%d ", *P); printf("\n"); return 0; }
A la fin des boucles, P contient l’adresse A+10 et pointe donc sur l’élément A[10] qui ne fait plus partie du tableau.
Exercice 2
Soit P un pointeur qui ‘pointe’ sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90}; int *P; P = A;
Quelles valeurs ou adresses fournissent ces expressions :
a) | *P+2 | => | la valeur 14 |
b) | *(P+2) | => | la valeur 34 |
c) | &P+1 | => | l’adresse du pointeur derrière le pointeur P |
(rarement utilisée) | |||
d) | &A[4]-3 | => | l’adresse de la composante A[1] |
e) | A+3 | => | l’adresse de la composante A[3] |
f) | &A[7]-P | => | la valeur (indice) 7 |
g) | P+(*P-10) | => | l’adresse de la composante A[2] |
h) | *(P+*(P+8)-A[7]) | => | la valeur 23 |
Exercice 3
#include <stdio.h> main() { /* Déclarations */ int A[50]; /* tableau donné */ int N; /* dimension du tableau */ int X; /* valeur à éliminer */ int *P1, *P2; /* pointeurs d'aide */ /* Saisie des données */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (P1=A; P1<A+N; P1++) { printf("Elément %d : ", P1-A); scanf("%d", P1); } printf("Introduire l'élément X à éliminer du tableau : "); scanf("%d", &X ); /* Affichage du tableau */ for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); /* Effacer toutes les occurrences de X et comprimer : */ /* Copier tous les éléments de P1 vers P2 et augmenter */ /* P2 pour tous les éléments différents de X. */ for (P1=P2=A; P1<A+N; P1++) { *P2 = *P1; if (*P2 != X) P2++; } /* Nouvelle dimension de A */ N = P2-A; /* Edition du résultat */ for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); return 0; }
Exercice 4
#include <stdio.h> main() { /* Déclarations */ int A[50]; /* tableau donné */ int N; /* dimension du tableau */ int AIDE; /* pour la permutation */ int *P1, *P2; /* pointeurs d'aide */ /* Saisie des données */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (P1=A; P1<A+N; P1++) { printf("Elément %d : ", P1-A); scanf("%d", P1); } /* Affichage du tableau */ for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); /* Inverser la tableau */ for (P1=A,P2=A+(N-1); P1<P2; P1++,P2--) { AIDE = *P1; *P1 = *P2; *P2 = AIDE; } /* Edition du résultat */ for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); return 0; }