Vous êtes sur la page 1sur 9

Lyce polyvalent DIDEROT

61, rue David dAngers


75019 PARIS

Dpartement IRIS

http://www.diderot.org

Exos Langage C

Les pointeurs
Exercices sur les pointeurs
Auteur
G.VALET

Version - Date
Version 1.3 - Nov 2010

Nom du fichier
exo-langageC-pointeurs.docx

Quelques exercices sur les pointeurs. Pour effectuer correctement ces exercices, se rfrer au "cours de
programmation en C de M. LEBRET" et notamment la partie sur les "pointeurs", les "structures" et les
"fonctions"

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

A. Sommaire
A. SOMMAIRE.................................................................................................................................................................................. 2
B. PRESENTATION DES POINTEURS ....................................................................................................................................................... 3
B.1. Dfinition ......................................................................................................................................................................... 3
B.2. Utilisation......................................................................................................................................................................... 3
B.3. Arithmtique des pointeurs ............................................................................................................................................. 4
C. QUELQUES QUESTIONS .................................................................................................................................................................. 5
D. ENONCE DES EXERCICES ................................................................................................................................................................. 6
D.1. Dclaration et utilisation ................................................................................................................................................. 6
D.2. Afficher une chane de caractres ................................................................................................................................... 6
D.3. Passage par adresse ........................................................................................................................................................ 6
D.4. Traitement de chaine....................................................................................................................................................... 7
D.5. Calculer la taille dune chane .......................................................................................................................................... 7
D.6. Conversion binaire-dcimal ............................................................................................................................................. 8
a. Objectif................................................................................................................................................................................................8
b. Algorithme ..........................................................................................................................................................................................8
c. Poids fort .............................................................................................................................................................................................8
d. Vrification dusage ............................................................................................................................................................................9
e. Mise en uvre ....................................................................................................................................................................................9

Les pointeurs - G.VALET Reproduction interdite

2/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

B. Prsentation des pointeurs


B.1. Dfinition
Un pointeur est une variable qui dsigne un emplacement mmoire (une adresse) occupe par une
donne dont le type est dfini lors de la dclaration. Lorsquon dfinit un pointeur, on prcise galement
le type de donne que contient lemplacement point :

char * p1;

p1 pointe sur le
caractre a stock
en mmoire

a
b
c
Mmoire

Une variable pointeur est dclare en utilisant le caractre * devant le nom de la variable. Cette
notation permet de distinguer les variables relles des pointeurs.

Prcisons galement quun pointeur pointe sur une donne en mmoire et que cette donne peut
tre code sur plusieurs emplacements mmoire. Dans ce cas, le pointeur pointe sur le premier
emplacement de la donne :
short int * p2;

p2 pointe sur
le 1er octet dun
entier court

01
4F
c

Codage dun entier court


(014F)16 = (335)10

Mmoire

B.2. Utilisation
Pour dclarer un pointeur, il suffit dutiliser la syntaxe suivante :
int *i ;

// * dans la dclaration indique quil sagit dun pointeur

Le pointeur est alors utilisable pour affecter le contenu de ladresse correspondante :


*i = 134;

// * dans laffectation dfini le contenu de ladresse pointe

Il est possible de manipuler les pointeurs de telle manire quils pointent sur un emplacement dj
occup par une variable :
char c =a ;
char *p1 = &c ;

// & signifie adresse de la variable c. p1 pointe sur c

Les pointeurs - G.VALET Reproduction interdite

3/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

char * p1 = &c;

char c = a;

c est une variable


contenant le
caractre a

p1 pointe sur le
caractre a stock
en mmoire

Mmoire

B.3. Arithmtique des pointeurs


Il sagit sans doute dune notion apportant le plus de puissance aux pointeurs. Larithmtique des
pointeurs permet de manipuler la mmoire avec une grande flexibilit avec dexcellentes performances.
Voici quelques explications :
Etant donn quun pointeur est typ , nous savons donc quel type de donne est stock
lemplacement mmoire associ.
Chaque type de donne a une taille dfinie lavance ( char = 1octet, float = 4 octets, double = 8
octets, )
Les oprateurs arithmtiques tiennent compte de cette taille ( +, -, ) et permettent de dplacer
un pointeur vers un autre emplacement mmoire
Voici un exemple illustrant larithmtique des pointeurs :
float tab[4] = { 13.45 , 4.56, 1.2, 67.4 }; // tab est ladresse du tableau
float *p1 = tab ;
// p1 est un pointeur qui pointe sur le 1er lment du tableau
for (int i=0 ; i<4 ; i++) {
printf(%f , , p1);
p1 = p1 + 1;
}

// Boucle daffichage des flottants


// Affichage du flottant point par p1
// p1 pointe sur le flottant suivant

Dans cet exemple, p1 pointe sur le 1er lment du tableau :

Mmoire
float tab[4];

float *p1 = tab;

Les pointeurs - G.VALET Reproduction interdite

13.45

4.56

p1+1;

1.2

67.4

p1+2;

p1+3;

4/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

C. Quelques questions
Voici quelques questions en relation avec les pointeurs et les structures.
Question 1. Dcrivez dans un tableau, les diffrents types de donnes numriques et alphanumriques
en prcisant lintervalle de nombres et loccupation mmoire.
Question 2. Le programme suivant manipule 2 pointeurs de types diffrents. Lun sur le type
unsigned int et lautre sur un char . Les 2 pointeurs vont pointer la mme adresse en mmoire.
Quel sera le contenu de p2 affich ? Expliquez ce rsultat
#include <stdio.h>
int main() {
unsigned int entier = 134486;
char *p;
p=&entier;
// p pointe sur entier
printf("Contenu de p =%c\n",*p);
return 0;
}

Question 3. Dessinez un schma de la mmoire pour la structure suivante en prenant en compte la


taille des diffrents lments de la structure.
struct ethernet {
char macdest[6];
char macsource[6];
short int type;
int checksum;
};

Les pointeurs - G.VALET Reproduction interdite

5/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

D. Enonc des exercices


D.1. Dclaration et utilisation
Dclarez un pointeur sur un char et affectez le contenu avec le caractre r

D.2. Afficher une chane de caractres


Soit le programme suivant :
#include <stdio.h>
void afficher( char *p) {
while ( *p != '\0')
// A COMPLETER
}

}
int main() {
char *chaine = "bonjour
afficher(chaine);
return 0;
}

les

amis";

Compltez la boucle while de la fonction afficher pour quelle affiche tous les caractres de la chane
SANS les espaces (Rappel : le caractre \0 est le caractre de fin de chaine en C).

D.3. Passage par adresse


Soit la fonction main suivante appelant une fonction calcul qui ralise deux oprations : la somme
et la diffrence de 2 entiers.
int main() {
int a=12, b=45;
int somme, difference;
calcul(a,b, &somme, &difference);
printf("a+b=%d , a-b=%d\n", somme, difference);
return 0;
}

Ecrire la fonction calcul pour quelle puisse raliser le travail demand

Les pointeurs - G.VALET Reproduction interdite

6/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

D.4. Traitement de chaine


Le but est de copier une chane de caractre dans une autre en inversant la casse (Passer de minuscule
majuscule et vice-versa). La fonction scase , donc voici la dclaration, assura cette tche :
void scase( char *p1, char *p2);

Voici le programme principal charg dappeler scase :


int main() {
char ch1[] = "abcdefghi jKLMnopqrstuvwxyz";
char ch2[26];
scase(ch1, ch2);
printf("ch1 = %s , ch2= %s \n", ch1, ch2);
return 0;
}

Compltez la fonction scase en utilisant les 2 pointeurs passs en paramtres de la fonction. Noubliez
pas que, daprs la table ASCII, les majuscules et les minuscules sont spars de 32 caractres :
char c1 = A ;
char c1bis = a ;
char c2 = c1 + 32 ;

// c2 contient a

char c3 = c1bis 32 ; // c3 contient A

D.5. Calculer la taille dune chane


La fonction strlen renvoie la longueur d'une chane de caractres. Un dbutant en langage C crit cette
fonction de la faon suivante:
int strlen(char
{
int
int
for

*s)
i;
len = 0;
(i=0; s[i]!=0; i++) {
len++;

}
return len;
}

En fait comme s est un pointeur, on peut s'en servir pour parcourir la chane plutt que d'utiliser une
variable supplmentaire i. Il suffit pour cela de l'incrmenter pour le faire pointer successivement vers les
diffrents caractres de la chane.

Les pointeurs - G.VALET Reproduction interdite

7/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

Rcrire ainsi la fonction strlen en utilisant une seule variable locale.

D.6. Conversion binaire-dcimal


a. Objectif
Lobjectif est de crer un programme ( btod.c ) capable de convertir un nombre binaire en nombre
dcimal. Une chane de caractre sera passe en argument du programme. Cette chane une suite de 0
et de 1 sera convertie en dcimal.
1001

btod

b. Algorithme

Acquisition
chaine

Lalgorithme sera bas sur le parcours de la chane passe en


paramtre. Si le caractre est un 1 , on ajoutera le poids
correspondant une variable resultat . A la fin du parcours
de la chane, la variable resultat sera le nombre converti
en dcimal.

Dfinir le poids de
dpart

Poids = 0 ?
non

non

Bit 1 ?
oui

resultat = resultat +
poids
Dcalage
droite dun bit
de poids

Afficher
resultat

c. Poids fort
A chaque caractre de la chane dentre, correspond un poids. Il faut donc connatre la taille de la chane
pour connatre le poids du 1er caractre.

Les pointeurs - G.VALET Reproduction interdite

8/9

Exos Langage C Les pointeurs

Version 1.3 - Nov 2010

Trouvez une relation entre la taille de la chane et le poids fort du nombre traduire.

d. Vrification dusage
Nous devons vrifier quil y a bien 1 paramtre pass en argument. On utilise la variable argc et
argv qui contiennent respectivement le nombre de paramtres et les valeurs de ces paramtres sous
forme dun tableau de pointeur sur des chanes :
int main(int argc, char *argv[]) {
if (argc<2) {
printf("Usage : %s chiffre_binaire\n", argv[0]);
exit(1);
}

Le 1er argument du tableau argv contient le nom du programme et non le 1er paramtre pass au
programme.

e. Mise en uvre
Ecrivez le programme et testez son bon fonctionnement.

Les pointeurs - G.VALET Reproduction interdite

9/9