Pourquoi les créateurs du standard ANSI-C ont-ils décidé de légaliser les pointeurs sur le premier élément derrière un tableau? Donner un exemple.
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
b) *(P+2)
c) &P+1
d) &A[4]-3
e) A+3
f) &A[7]-P
g) P+(*P-10)
h) *(P+*(P+8)-A[7])
Ecrire un programme qui lit un entier X et un tableau A du type int au clavier et élimine toutes les occurrences de X dans A en tassant les éléments restants. Le programme utilisera les pointeurs P1 et P2 pour parcourir le tableau.
Ecrire un programme qui range les éléments d'un tableau A du type int dans l'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une variable numérique AIDE pour la permutation des éléments.
Solution: 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#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; } |
Soit P un pointeur qui 'pointe' sur un tableau A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};Quelles valeurs ou adresses fournissent ces expressions:
int *P;
P = A;
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#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; } |