Quelques exercices sur la manipulation de pointeurs
Exercice 1 : Soit le programme suivant : main()
{
int A = 1;
int B = 2;
int C = 3;
int *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
P1=&A;
*P2=*P1/=*P2;
return 0;
}
Complétez le tableau ci-dessus pour
chaque instruction du programme ci-dessus.
Exercice 2 : Soit P un pointeur qui 'pointe' sur un tableau T:
int T[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = T;
Quelles valeurs ou adresses fournissent ces expressions:
a) *P+2
b) *(P+2)
c) &P+1 d) &T[4]-3
e) T+3
f) &T[7]-P g) P+(*P-10)
h) *(P+*(P+8)-T[7])
Exercice 3 : Écrire un programme qui lit un entier C et un tableau A du type int au clavier et supprime toutes les occurrences de C dans T en tassant les éléments restants. Le programme utilisera les pointeurs P1 et P2 pour parcourir le tableau.
Exercice 4 : Écrire un programme qui range les éléments d'un tableau T du type int dans l'ordre inverse. Le programme utilisera des pointeurs P1 et P2 et une variable intermédiaire pour la permutation des éléments.
A B C P1 P2
Init. 1 2 3 / /
P1=&A 1 2 3 &A / P2=&C
*P1=(*P2)++
P1=P2 P2=&B
*P1-=*P2 ++*P2
*P1*=*P2 A=++*P2**P1 P1=&A
*P2=*P1/=*P2
1
Exercice 5 : Écrire un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et élimine toutes les lettres de CH1 qui apparaissent aussi dans CH2. Utiliser deux pointeurs P1 et P2, une variable logique TROUVE et la fonction strcpy.
Exemple: Bonjour Bravo ==> njou
Bonjour Bravo ==> Bnjou abacab aa ==> bcab
Exercice 6 : Soient les déclarations de NOM1 et NOM2:
char *NOM1[] = {"Marc", "Jean-Marie", "Paul", "François-Xavier", "Claude" };
char NOM2[][16] = {"Marc", "Jean-Marie", "Paul", "François-Xavier", "Claude" };
a) Représenter graphiquement la mémorisation des deux variables NOM1 et NOM2.
b) Imaginez que vous devez écrire un programme pour chacun des deux tableaux qui trie les chaînes selon l'ordre lexicographique. En supposant que vous utilisez le même algorithme de tri pour les deux programmes, lequel des deux programmes sera probablement le plus rapide?
Exercice 7 : Soit le programme suivant : #include <stdio.h>
char fonc1(char , char );
char fonc2(char *, char *);
int main() {
char a= 'V';
char b= 'D';
char i, j;
i= fonc1(a, b);
printf("a=%c b=%c\n, a, b);
j= fonc2(&a, &b);
printf("a=%c b=%c\n", a, b);
return 0;
}
char fonc1(char c1, char c2){
c1= 'P';
c2= 'Q';
return ((c1<c2) ? c1 : c2);
}
char fonc2(char *c1, char *c2){
*c1= 'P';
*c2= 'Q';
return ((*c1==*c2) ? *c1 : *c2);
}