Exercices langage C arithmétique des pointeurs
Exercice 1
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.
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+2b) *(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])
Exercice 3
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.
Exercice 4
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:
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
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 scanf("%d", P);
/* Affichage du tableau */
printf("Tableau donné A :\n");
for (P=A; 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.
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 |
#include
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 {
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 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 {
*P2 = *P1;
if (*P2 != X)
P2++;
}
/* Nouvelle dimension de A */
N = P2-A;
/* Edition du résultat */
for (P1=A; P1 printf("%d ", *P1);
printf("\n");
return 0;
}
#include
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 {
printf("Elément %d : ", P1-A);
scanf("%d", P1);
}
/* Affichage du tableau */
for (P1=A; P1 printf("%d ", *P1);
printf("\n");
/* Inverser la tableau */
for (P1=A,P2=A+(N-1); P1 {
AIDE = *P1;
*P1 = *P2;
*P2 = AIDE;
}
/* Edition du résultat */
for (P1=A; P1 printf("%d ", *P1);
printf("\n");
return 0;
}