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+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])

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:

for (P=A ; 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
main()
{
/* Déclarations */
int A[10]; /* tableau */
int *P; /* pointeur dans A */
/* Saisie des données */
printf("Introduire 10 entiers : \n");
for (P=A; Pscanf("%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;
}

Article publié le 06 Février 2011 Mise à jour le Mardi, 08 Novembre 2022 09:54 par Salim KHALIL