75019 PARIS
http://www.diderot.org
Exos Langage C
Les pointeurs
Exercices sur les pointeurs
Auteur Version - Date Nom du fichier
G.VALET Version 1.3 - Nov 2010
exo-langageC-pointeurs.
docxQuelques exercices sur les pointeurs. Pour effectuer correctement ces exercices, se référer au "cours de programmation en C de M. LEBRET" et notamment à la partie sur les "pointeurs", les "structures" et les
"fonctions"
Les pointeurs - G.VALET – Reproduction interdite 2 / 9
A. Sommaire
A.SOMMAIRE ... 2
B.PRESENTATION DES POINTEURS ... 3
B.1. Définition ... 3
B.2. Utilisation... 3
B.3. Arithmétique des pointeurs ... 4
C.QUELQUES QUESTIONS ... 5
D.ENONCE DES EXERCICES ... 6
D.1. Déclaration et utilisation ... 6
D.2. Afficher une chaîne de caractères ... 6
D.3. Passage par adresse ... 6
D.4. Traitement de chaine ... 7
D.5. Calculer la taille d’une chaîne ... 7
D.6. Conversion binaire-décimal ... 8
a. Objectif ... 8
b. Algorithme ... 8
c. Poids fort ... 8
d. Vérifi atio d usage ... 9
e. Mise e œuv e ... 9
Les pointeurs - G.VALET – Reproduction interdite 3 / 9
B. Présentation des pointeurs
B.1. Définition
Un pointeur est une variable qui désigne un emplacement mémoire (une adresse) occupée par une do e do t le t pe est d fi i lo s de la d la atio . Lo s u o définit un pointeur, on précise également le t pe de do e ue o tie t l e pla e e t poi t :
Mémoire
char * p1;
a
p1 « pointe » sur le caractère ‘a’ stocké en mémoire
P iso s gale e t u u poi teu « pointe » sur une donnée en mémoire et que cette donnée peut être codée sur plusieurs emplacements mémoire. Dans ce cas, le pointeur « pointe » sur le premier emplacement de la donnée :
Mémoire
short int * p2;
01 4F
p2 « pointe » sur le 1 er octet d’un entier court
Codage d’un entier court (014F)
16= (335)
10B.2. Utilisation
Pou d la e u poi teu , il suffit d utili ser la syntaxe suivante :
int *i ; // « * » dans la déclaration indique qu‟il s‟agit d‟un pointeur
Le poi teu est alo s utilisa le pou affe te le o te u de l ad esse o espo da te :
*i = 134; // « * » dans l‟affectation défini le contenu de l‟adresse pointée
Il est possi le de a ipule les poi teu s de telle a i e u ils « pointent » sur un emplacement déjà occupé par une variable :
char c =‟a‟ ;
char *p1 = &c ; // « & » signifie adresse de la variable c. p1 « pointe » sur c
Une variable pointeur est déclarée en utilisant le caractère « * » devant le nom de la variable. Cette
notation permet de distinguer les variables réelles des pointeurs.
Les pointeurs - G.VALET – Reproduction interdite 4 / 9
Mémoire
char * p1 = &c;
a
p1 « pointe » sur le caractère ‘a’ stocké en mémoire
char c = „a‟;
c est une variable contenant le caractère ‘a’
B.3. Arithmétique des pointeurs
Il s agit sa s doute d u e otio appo ta t le plus de puissa e au poi teu s. L a ith ti ue des pointeurs permet de manipuler la mémoire avec une grande fle i ilit ave d e elle tes pe fo a es.
Voici quelques explications :
Eta t do u u poi teu est « typé », nous savons donc quel type de donnée est stocké à l emplacement mémoire associé.
Cha ue t pe de do e a u e taille d fi ie à l ava e ha r = 1octet, float = 4 octets, double = 8 o tets, …
Les opérateurs arithmétiques tiennent compte de cette taille ( +, - , … et permettent de déplacer un pointeur vers un autre emplacement mémoire
Voi i u e e ple illust a t l a ith ti ue des poi teu s :
float tab[4] = { 13.45 , 4.56, 1.2, 67.4 }; // tab est l‟adresse du tableau
float *p1 = tab ; // p1 est un pointeur qui pointe sur le 1er élément du tableau
for (int i=0 ; i<4 ; i++) { // Boucle d‟affichage des flottants printf(“%f , ”, p1); // Affichage du flottant pointé par p1 p1 = p1 + 1; // p1 pointe sur le flottant suivant }
Dans cet exemple, « p1 » pointe sur le 1
erélément du tableau :
Mémoire
float *p1 = tab;
float tab[4]; 13.45 4.56 1.2 67.4
p1+1; p1+2; p1+3;
Les pointeurs - G.VALET – Reproduction interdite 5 / 9
C. Quelques questions
Voici quelques questions en relation avec les pointeurs et les structures.
Question 1. Décrivez dans un tableau, les différents types de données numériques et alphanumériques e p isa t l i te valle de o es et l o upatio oi e.
Question 2. Le programme suivant manipule 2 pointeurs de types diff e ts. L u su le t pe
« unsigned int » et l aut e su u « char ». Les 2 pointeurs vont pointer à la même adresse en mémoire.
Quel sera le contenu de p2 affiché ? Expliquez ce résultat
#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 schéma de la mémoire pour la structure suivante en prenant en compte la taille des différents éléments de la structure.
struct ethernet { char macdest[6];
char macsource[6];
short int type;
int checksum;
};