Les pointeurs en langage C
Exercice 1 :
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])
Solution :
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 2 :
Ecrire un programme en langage C 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.
Solution :
#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 3 :
Ecrire un programme en langage C 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 :
#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;
}
Exercice 4 :
Ecrire un programme en langage C qui lit deux tableaux
d'entiers A et B et leurs dimensions N et M au clavier et qui ajoute les
éléments de B à la fin de A. Utiliser deux pointeurs PA et PB pour le transfer
et afficher le tableau résultant A.
Solution :
#include
<stdio.h>
main()
{
/*
Déclarations */
int
A[100], B[50]; /* tableaux */
int
N, M; /* dimensions des tableaux */
int
*PA,*PB; /* pointeurs d'aide
*/
/*
Saisie des données */
printf("Dimension du tableau A (max.50) :
");
scanf("%d", &N );
for (PA=A; PA<A+N; PA++)
{
printf("Elément %d : ", PA-A);
scanf("%d", PA);
}
printf("Dimension du tableau B (max.50) : ");
scanf("%d", &M );
for (PB=B; PB<B+M; PB++)
{
printf("Elément %d : ", PB-B);
scanf("%d", PB);
}
/*
Affichage des tableaux */
printf("Tableau donné A :\n");
for (PA=A; PA<A+N; PA++)
printf("%d ",
*PA);
printf("\n");
printf("Tableau donné B :\n");
for (PB=B; PB<B+M; PB++)
printf("%d ",
*PB);
printf("\n");
/*
Copier B à la fin de A */
for (PA=A+N,PB=B ; PB<B+M ;
PA++,PB++)
*PA = *PB;
/*
Nouvelle dimension de A */
N +=
M;
/*
Edition du résultat */
printf("Tableau résultat A :\n");
for (PA=A; PA<A+N; PA++)
printf("%d ", *PA);
printf("\n");
return 0;
}
Exercice 5 :
Ecrire
de deux façons différentes, un programme en langage C qui vérifie sans utiliser une fonction
de <string>, si une chaîne CH introduite au clavier est un
palindrome:
a) en utilisant uniquement le formalisme tableau
b) en utilisant des pointeurs au lieu des indices numériques
Rappel:
Un palindrome est un mot qui reste
le même qu'on le lise de gauche à droite ou de droite à gauche:
Solution :
a) en utilisant uniquement le formalisme tableau
#include <stdio.h>
main()
{
/*
Déclarations */
char
CH[101]; /* chaîne donnée */
int
I,J; /* indices courants */
int
PALI; /* indicateur logique: */
/* vrai si CH est un palindrome
*/
/*
Saisie des données */
printf("Entrez une ligne de texte
(max.100 caractères) :\n");
gets(CH);
/*
Placer J sur la dernière lettre de la chaîne */
for(J=0; CH[J]; J++)
;
J--;
/*
Contrôler si CH est un palindrome */
PALI=1;
for (I=0 ; PALI && I<J ; I++,J--)
if (CH[I] != CH[J])
PALI=0;
/*
Affichage du résultat */
if
(PALI)
printf("La chaîne \"%s\" est un palindrome.\n", CH);
else
printf("La chaîne \"%s\" n'est pas un
palindrome.\n", CH);
return 0;
}
b)
en utilisant des pointeurs au lieu des indices numériques :
#include <stdio.h>
main()
{
/*
Déclarations */
char
CH[101]; /* chaîne donnée */
char
*P1,*P2; /* pointeurs d'aide */
int
PALI; /* indicateur logique: */
/* vrai si CH est un palindrome */
/*
Saisie des données */
printf("Entrez une ligne de texte
(max.100 caractères) :\n");
gets(CH);
/*
Placer P2 sur la dernière lettre de la chaîne */
for
(P2=CH; *P2; P2++)
;
P2--;
/*
Contrôler si CH est un palindrome */
PALI=1;
for (P1=CH ; PALI && P1<P2 ;
P1++,P2--)
if (*P1 != *P2) PALI=0;
/*
Affichage du résultat */
if
(PALI)
printf("La chaîne \"%s\" est un palindrome.\n", CH);
else
printf("La chaîne \"%s\" n'est pas un
palindrome.\n", CH);
return 0;
}
Exercice 6 :
Ecrire
un programme en langage C qui lit une chaîne de caractères CH et détermine la longueur de la
chaîne à l'aide d'un pointeur P. Le programme n'utilisera pas de variables
numériques.
Solution :
#include <stdio.h>
main()
{
/*
Déclarations */
char
CH[101]; /* chaîne donnée */
char
*P; /* pointeur d'aide */
/*
Saisie des données */
printf("Entrez une ligne de texte
(max.100 caractères) :\n");
gets(CH);
/*
Placer P à la fin de la chaîne */
for
(P=CH; *P; P++)
;
/*
Affichage du résultat */
printf("La chaîne \"%s\" est
formée de %d caractères.\n",
CH, P-CH);
return 0;
}
ConversionConversion EmoticonEmoticon
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.