Langage C : LES POINTEURS (Cours et Exercices corrigés)
Monday, June 6, 2011     17:19
  • Mon @ IP: 23.20.25.122



retour

Poster un commentaire ou une réponse

LES POINTEURS (Cours et Exercices corrigés)

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:14:33

L'étude des pointeurs montre l'adaptation du langage C à la conduite de processus. On verra dans ce chapitre et les suivants la puissance de cette notion par ailleurs de concept simple pour un informaticien industriel.


L'OPERATEUR ADRESSE &


L'opérateur adresse & retourne l'adresse d'une variable en mémoire.

Exemple:
int i = 8;
printf("VOICI i: %d\n",i);
printf("VOICI SON ADRESSE EN HEXADECIMAL: %p\n",&i);

On remarque que le format d'une adresse est %p (hexadécimal) ou %d (décimal) dans printf.

Exercice V_1: Exécuter l’exemple précédent, et indiquer les cases-mémoire occupées par la variable i.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:15:17

-------------------------------LES POINTEURS-------------------


Définition: Un pointeur est une adresse mémoire. On dit que le pointeur pointe sur cette adresse.


-----------------------------DECLARATION DES POINTEURS------------------


Une variable de type pointeur se déclare à l'aide de l'objet pointé précédé du symbole * (opérateur d'indirection).

Exemple:
char *pc;pc est un pointeur pointant sur un objet de type char

int *pi;pi est un pointeur pointant sur un objet de type int

float *pr;pr est un pointeur pointant sur un objet de type float

L'opérateur * désigne en fait le contenu de l'adresse.

Exemple:
char *pc;
*pc = 34 ;
printf("CONTENU DE LA CASE MEMOIRE: %c\n",*pc);
printf("VALEUR DE L'ADRESSE EN HEXADECIMAL: %p\n",pc);

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:15:48

---------------------ARITHMETIQUE DES POINTEURS-----------------


On peut essentiellemet déplacer un pointeur dans un plan mémoire à l'aide des opérateurs d'addition, de soustraction, d'incrémentation, de décrémentation. On ne peut le déplacer que d'un nombre de cases mémoire multiple du nombre de cases réservées en mémoire pour la variable sur laquelle il pointe.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:16:36


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:16:57

Exemples:


int *pi; /* pi pointe sur un objet de type entier */
float *pr; /* pr pointe sur un objet de type réel */
char *pc; /* pc pointe sur un objet de type caractère */

*pi = 421; /* 421 est le contenu de la case mémoire p et des 3 suivantes */
*(pi+1) = 53; /* on range 53 4 cases mémoire plus loin */
*(pi+2) = 0xabcd; /* on range 0xabcd 8 cases mémoire plus loin */
*pr = 45.7; /* 45,7 est rangé dans la case mémoire r et les 3 suivantes */
pr++; /* incrémente la valeur du pointeur r (de 4 cases mémoire) */
printf("L'ADRESSE r VAUT: %p\n",pr); /* affichage de la valeur de l'adresse r */

*pc = 'j'; /* le contenu de la case mémoire c est le code ASCII de 'j' */
pc--; /* décrémente la valeur du pointeur c (d'une case mémoire) */

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:18:46

------------------------------ALLOCATION DYNAMIQUE------------------


Lorsque l'on déclare une variable char, int, float .... un nombre de cases mémoire bien défini est réservé pour cette variable. Il n'en est pas de même avec les pointeurs.

Exemple:

char *pc;
*pc = 'a';------->/* le code ASCII de a est rangé dans la case mémoire pointée par c */
*(pc+1) = 'b';--->/* le code ASCII de b est rangé une case mémoire plus loin */
*(pc+2) = 'c';--->/* le code ASCII de c est rangé une case mémoire plus loin */
*(pc+3) = 'd';--->/* le code ASCII de d est rangé une case mémoire plus loin */


Dans cet exemple, le compilateur a attribué une valeur au pointeur c, les adresses suivantes sont donc bien définies; mais le compilateur n'a pas réservé ces places: il pourra très bien les attribuer un peu plus tard à d'autres variables. Le contenu des cases mémoires c c+1 c+2 c+3 sera donc perdu.
Ceci peut provoquer un blocage du système sous WINDOWS.

Il existe en langage C, des fonctions permettant d'allouer de la place en mémoire à un pointeur.
Il faut absolument les utiliser dès que l'on travaille avec les pointeurs.

Exemple: la fonction malloc

char *pc;
int *pi,*pj,*pk;
float *pr;
pc = (char*)malloc(10); /* on réserve 10 cases mémoire, soit la place pour 10 caractères */
pi = (int*)malloc(16); /* on réserve 16 cases mémoire, soit la place pour 4 entiers */
pr = (float*)malloc(24); /* on réserve 24 places en mémoire, soit la place pour 6 réels */
pj = (int*)malloc(sizeof(int)); /* on réserve la taille d'un entier en mémoire */
pk = (int*)malloc(3*sizeof(int)); /* on réserve la place en mémoire pour 3 entiers */

Libération de la mémoire: la fonction free

free(pi); /* on libère la place précédemment réservée pour i */
free(pr); /* on libère la place précédemment réservée pour r */

Exercice V_2:

adr1 et adr2 sont des pointeurs pointant sur des réels. Le contenu de adr1 vaut
-45,78; le contenu de adr2 vaut 678,89. Ecrire un programme qui affiche les valeurs de adr1, adr2 et de leur contenu.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:19:44

-------------------------AFFECTATION D'UNE VALEUR A UN POINTEUR-----------------------

Dans les exemples précédents, l'utilisateur ne choisit pas la valeur des adresses mémoire attribuées par le compilateur à chaque variable. L'utilisateur se contente de lire la valeur de ces adresses en l' affichant sur l'écran.

On ne peut pas affecter directement une valeur à un pointeur:
l'écriture suivante est interdite:
char *pc;
pc = 0xfffe;

On peut cependant être amené à définir par programmation la valeur d'une adresse. On utilise pour cela l'opérateur de "cast", jeu de deux parenthèses.
- Par exemple pour adresser un périphérique (adressage physique),
- Par exemple pour contrôler la zône DATA dans un plan mémoire.

Exemples:

char *pc;
pc = (char*)0x1000;/* p est l'adresse 0x1000 et pointe sur un caractère */

int *pi;
pi = (int*)0xfffa;/* i est l'adresse 0xfffa et pointe sur un entier */

Lorsqu'on utilise une fonction d'allocation dynamique on ne peut affecter de valeur au pointeur à l'aide de l'opérateur de cast.
Ces 2 premiers exemples sont à proscrire sous WINDOWS.

Exercice V_3:

pi est un pointeur sur un entier; pi vaut 0x5000 et son contenu vaut 300. Ecrire le programme correspondant (programme dangereux sous WONDOWS).

L'opérateur de "cast", permet d'autre part, à des pointeurs de types différent de pointer sur la même adresse.


Exemple:
char *pc;/* pc pointe sur un objet de type caractère */
int *pi;/* pi pointe sur un objet de type entier */
pi = (int*)malloc(4) ; /* allocation dynamique pour i */
pc = (char*)i;/* c et i pointent sur la même adresse, c sur un caractère */

Exercice V_4:

adr_i est un pointeur de type entier; son contenu i vaut 0x12345678. A l'aide d'une conversion de type de pointeur, écrire un programme montrant le rangement des 4 octets en mémoire.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:19:54

Exercice V_5:

Saisir un texte. Ranger les caractères en mémoire. Lire le contenu de la mémoire et y compter le nombre d'espaces et de lettres e .

Exercice V_6:

Saisir 6 entiers et les ranger à partir de l'adresse adr_deb. Rechercher le maximum, l'afficher ainsi que son adresse.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:20:13

----------------------PETIT RETOUR A LA FONCTION SCANF----------------


On a vu au chapitre 2 que pour saisir un caractère ou un nombre, on donne en fait l'adresse de ce caractère:

Exemple:
char c;
printf("TAPER UNE LETTRE: ");
scanf("%c",&c);

On saisit ici le contenu de l'adresse &c c'est à dire le caractère c lui-même.

On peut donc aussi procéder ainsi:

char *adr;
printf("TAPER UNE LETTRE: ");
scanf("%c",adr);

On saisit ici le contenu de l'adresse adr.

Cette méthode s'applique aux caractères (char), aux entiers (int), aux réels (float).

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:20:39

---------------------------CORRIGE DES EXERCICES------------------


Exercice V_2:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
float *adr1,*adr2;
adr1 = (float*)malloc(4);
adr2 = (float*)malloc(4);
*adr1 = -45.78;
*adr2 = 678.89;
printf("adr1 = %p adr2 = %p r1 = %f r2 = %f\n",adr1,adr2,*adr1,*adr2);
free(adr1);
free(adr2);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}

Exercice V_3:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
int *i;
i = (int*)malloc(4);
*i = 300;
printf(" adresse = %p variable = %d\n",i,*i);
free(i);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}

Exercice V_4:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char *adr_c;
int *adr_i,i=0x12345678;
adr_i = &i;
adr_c = (char*)adr_i;
printf("ADRESSE: %p CONTENU: %x\n",adr_c,*adr_c);
printf("ADRESSE: %p CONTENU: %x\n",adr_c+1,*(adr_c+1));
printf("ADRESSE: %p CONTENU: %x\n",adr_c+2,*(adr_c+2));
printf("ADRESSE: %p CONTENU: %x\n",adr_c+3,*(adr_c+3));
getch();
}

L'analyse de l'exécution en BORLANC C++, montre que les microprocesseurs INTEL rangent en mémoire d'abord les poids faibles d'une variable.


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:20:57

Exercice V_5:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char *adr_deb,c;
int i,imax,compt_e = 0,compt_sp = 0;
adr_deb = (char*)malloc(30);/* texte d'au plus 30 caracteres */

/* saisie et rangement du texte */
printf("\nADRESSE DU TEXTE: %p (ATTRIBUEE PAR LE COMPILATEUR)",adr_deb);
printf("\nENTRER UN TEXTE: ");
for (i=0;((c=getchar())!='\n');i++) *(adr_deb + i) = c;
imax = i;/* borne superieure */

/* lecture de la memoire et tri */
for (i=0;i<imax;i++)
{
c = *(adr_deb+i);
printf("\nCARACTERE: %c ADRESSE: %p",c,adr_deb+i);
if (c=='e') compt_e++;
if (c==' ') compt_sp++;
}

/* resultats */
printf("\nNOMBRE DE e: - NOMBRE d'espaces: -\n",compt_e,compt_sp);
free(adr_deb);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:21:11

Exercice V_6:

#include <stdio.h>
#include <conio.h> #include <alloc.h> void main() { int *adr_deb,*adr_max,i,imax=6,max; adr_deb=(int*)malloc(4*6);
printf("\nADRESSE DE BASE: %p (CHOISIE PAR LE PROGRAMMEUR)\n",adr_deb);
/* saisie des nombres */
printf("SAISIE DES NOMBRES: \n"); for(i=0;i<imax;i++)
{
printf("ENTRER UN NOMBRE: ");
scanf("%d",adr_deb+i);
}

/* tri */ max = *adr_deb;
adr_max = (int*)adr_deb; for(i=0;i<imax;i++) { if(*(adr_deb+i)>max) { max = *(adr_deb+i); adr_max = adr_deb+i;
} }

/* resultats */ printf("LE MAXIMUM:%d SON ADRESSE:%p\n",max,adr_max);
free(adr_deb);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE");
getch(); }

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:21:29

Les exécutables des exercices:

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:21:53

EXV_1.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:22:02

EXV_2.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:22:12

EXV_3.CPP


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:22:23

EXV_4.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:22:36

EXV_5.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:22:46

EXV_6.CPP

Poster un commentaire ou une réponse :
Poster
     Ajouter un document à la discussion:
       

Actualité informatique et High-Tech

16-10-2015               lire

Dropbox propose aussi un outil d'écriture collaborative à son service

16-10-2015               lire

Bientôt des DRM dans des JPEG

17-04-2015               lire

Google propose une requête pour retrouver son téléphone

17-04-2015               lire

Youtube prépare une offre payante sans publicité

17-04-2015               lire

Sony Pictures : Des milliers de mails et documents confidentiels dévoilés

07-04-2015               lire

T411 bloqué par les FAI français

07-04-2015               lire

NVIDIA publie un pilote correctif et met à jour SHIELD Hub ainsi que GeForce Experience

07-04-2015               lire

Linkedin acquiert la start-up Refresh

03-04-2015               lire

Chromebit, la clé USB Google et Asus qui transforme n’importe quel écran en ordinateur

03-04-2015               lire

Une personne aurait pu supprimer toutes les vidéos d’une chaine Youtube en quelques secondes

03-04-2015               lire

Firefox 37 apporte un cryptage complémentaire à HTTPS

03-04-2015               lire

Windows XP, ce système qui ne veut pas mourir

02-04-2015               lire

Piratage de Labio.fr : le laboratoire répond à nos questions et ne payera pas la rançon

02-04-2015               lire

AWS lance des instances géantes avec 48 To de stockage

02-04-2015               lire

WhatsApp ajoute les appels gratuits et illimités à son application

31-03-2015               lire

Nadim Kobeissi : de Cryptocat à Peerio, du piratage au doctorat

31-03-2015               lire

L'Université de Nantes inaugure son datacenter modulaire taillé pour le HPC

31-03-2015               lire

GitHub victime d’une attaque DDoS majeure

27-03-2015               lire

Googlinette : les recherches de Google en devinettes

27-03-2015               lire

F8 : Facebook ouvre Messenger au e-commerce

27-03-2015               lire

À la SNCF, une fuite de données simple comme une touche F5

23-03-2015               lire

Des satellites GPS de Boeing affectés par une erreur technique

23-03-2015               lire

Plus de 700 000 routeurs ADSL vulnérables au piratage

23-03-2015               lire

Twitter sous le coup d’une action collective pour discrimination

22-03-2015               lire

Les montres connectées étaient déjà présentes dans les films, séries et dessins animés

22-03-2015               lire

Une Audi autonome va traverser les USA de SF à New York

20-03-2015               lire

Éclipse du Soleil : comment la suivre en direct sur Internet

20-03-2015               lire

Projet Leap : des bus 2.0 à San Francisco

20-03-2015               lire

Nvidia dévoile Drive PX, un système de conduite autonome

17-03-2015               lire

Embarquez pour Apollo 11, expérience virtuelle hors du commun

16-03-2015               lire

Ce jour où Google a exposé les données de 282 867 domaines

16-03-2015               lire

Yahoo publie le code de son plug-in de chiffrement mail

16-03-2015               lire

Après un an sans mise à jour, HAWKEN revient à la vie

12-03-2015               lire

Le big data au service du séquençage ADN pour accélérer les diagnostics

12-03-2015               lire

Clap de fin pour PlayStation Mobile

12-03-2015               lire

Apple : retour à la normale après une panne de plus de 11 heures

12-03-2015               lire

Ericsson va supprimer 2 200 postes en Suède

12-03-2015               lire

Le plan de Fleur Pellerin contre le piratage sur Internet

10-03-2015               lire

Apple Watch, Watch Edition et Watch Sport : de 399 à 18.000 euros !

10-03-2015               lire

Apple présente le “nouveau MacBook” qui remplace le MacBook Air

09-03-2015               lire

Google développe une version d'Android pour la réalité virtuelle

09-03-2015               lire

Quand la MPAA demande à Google de déréférencer son propre site

09-03-2015               lire

Heroes of the Dorm : un tournoi HotS avec 450 000 $ de bourses d'études à gagner

09-03-2015               lire

1 milliard d'adresses mails volées, 2 pirates inculpés

09-03-2015               lire

VMware accusé de violation de code Linux

09-03-2015               lire

Les drones civils bientôt immatriculés ?

05-03-2015               lire

7 sites qui permettent d’envoyer des fichiers de + ou – 2 Go

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung56% des consommateurs inquiets pour leurs données en Europe

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung

04-03-2015               lire

MWC 2015 : Onevisage pésente un scan facial 3D pour smartphones

04-03-2015               lire

Caméras sportives : Xiaomi s'attaque au monopole GoPro

04-03-2015               lire

Yi Camera, la caméra embarquée de Xiaomi à moins de 60€

04-03-2015               lire

Faille FREAK : quand des connexions SSL/TLS se contentent d'un chiffrement RSA sur... 512 bits

04-03-2015               lire

Bientôt des pubs sur Google Play (Android)

28-02-2015               lire

En partenariat avec "Positive Technologies", Esprit a l'honneur d'inviter ses étudiants à la 1ère édition de l’événement ESPRIT HACK DAYS dans les locaux d'ESPRIT Chotrana 2 et ce le 03 et le 04 Mars 2015.

28-02-2015               lire

La direction des stages d’ESPRIT et Ernst & Young ont le plaisir d'inviter ses étudiants à la journée de l’entreprise du mercredi 4 mars 2015 dans la salle E5 d’ESPRIT Factory.

25-02-2015               lire

Adobe fête les 25 ans de son logiciel Photoshop

25-02-2015               lire

Linux 4.0 : gros numéro et petite version

Haut de page.