Exercice langage C corrigé arithmétique des pointeurs

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

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *