Flux rss
Collection CommentÇaMarche.net
Bookmark Ajouter aux favoris / Partager
Comme en langage C, le langage C++ permet d'utiliser des pointeurs pour manipuler des données, mais il introduit aussi le concept de référence, très pratique pour permettre la modification d'une donnée passée en paramètre d'une fonction.

Définition d'un pointeur

Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des structures dynamiques, c'est-à-dire qui évolue au cours du temps (par opposition aux tableaux par exemple qui sont des structures de données statiques, dont la taille est figée à la définition).

Comprendre la notion d'adresse

Comme nous l'avons vu, un pointeur est une variable qui permet de stocker une adresse, il est donc nécessaire de comprendre ce qu'est une adresse.

Lorsque l'on exécute un programme, celui-ci est stocké en mémoire, cela signifie que d'une part le code à exécuter est stocké, mais aussi que chaque variable que l'on a défini à une zone de mémoire qui lui est réservée, et la taille de cette zone correspond au type de variable que l'on a déclaré.
En réalité la mémoire est constituée de plein de petites cases de 8 bits (un octet). Une variable, selon son type (donc sa taille), va ainsi occuper une ou plusieurs de ces cases (une variable de type char occupera une seule case, tandis qu'une variable de type long occupera 4 cases consécutives).

Chacune de ces « cases » (appelées blocs) est identifiée par un numéro. Ce numéro s'appelle adresse.

On peut donc accéder à une variable de 2 façons :

  • grâce à son nom
  • grâce à l'adresse du premier bloc alloué à la variable

Il suffit donc de stocker l'adresse de la variable dans un pointeur (il est prévu pour cela) afin de pouvoir accéder à celle-ci (on dit que l'on « pointe vers la variable »).

Le schéma ci-dessus montre par exemple par quel mécanisme il est possible de faire pointer une variable (de type pointeur) vers une autre. Ici le pointeur stocké à l'adresse 24 pointe vers une variable stockée à l'adresse 253 (les valeurs sont bien évidemment arbitraires).

Comment connaît-on l'adresse d'une variable ?

En réalité vous n'aurez jamais à écrire l'adresse d'une variable, d'autant plus qu'elle change à chaque lancement de programme étant donné que le système d'exploitation alloue les blocs de mémoire qui sont libres, et ceux-ci ne sont pas les mêmes à chaque exécution.

Ainsi, il existe une syntaxe permettant de connaître l'adresse d'une variable, connaissant son nom :
il suffit de faire précéder le nom de la variable par le caractère & (« ET commercial ») pour désigner l'adresse de cette variable :

&Nom_de_la_variable

Intérêt des pointeurs

Les pointeurs ont un grand nombre d'intérêts :

  • Ils permettent de manipuler de façon simple des données pouvant être importantes (au lieu de passer à une fonction un élément très grand (en taille) on pourra par exemple lui fournir un pointeur vers cet élément...)
  • Les tableaux ne permettent de stocker qu'un nombre fixé d'éléments de même type. En stockant des pointeurs dans les cases d'un tableau, il sera possible de stocker des éléments de taille diverse, et même de rajouter des éléments au tableau en cours d'utilisation (c'est la notion de tableau dynamique qui est très étroitement liée à celle de pointeur)
  • Il est possible de créer des structures chaînées, c'est-à-dire comportant des maillons

Déclaration d'un pointeur

Un pointeur est une variable qui doit être définie en précisant le type de variable pointée, de la façon suivante :

type * Nom_du_pointeur

Le type de variable pointée peut être aussi bien un type primaire (tel que int, char...) qu'un type complexe (tel que struct...).

Un pointeur doit OBLIGATOIREMENT être typé !
Grâce au symbole '*' le compilateur sait qu'il s'agit d'une variable de type pointeur et non d'une variable ordinaire, de plus, étant donné que vous précisez (obligatoirement) le type de variable, le compilateur saura combien de blocs suivent le bloc situé à l'adresse pointée.

Initialisation d'un pointeur

Après avoir déclaré un pointeur il faut l'intialiser. Cette démarche est très importante car lorsque vous déclarez un pointeur, celui-ci contient ce que la case où il est stocké contenait avant, c'est-à-dire n'importe quel nombre. Autrement dit, si vous n'initialisez pas votre pointeur, celui-ci risque de pointer vers une zone hasardeuse de votre mémoire, ce qui peut être un morceau de votre programme ou... de votre système d'exploitation !

Un pointeur non initialisé représente un danger !

Pour initialiser un pointeur, il faut utiliser l'opérateur d'affectation '=' suivi de l'opérateur d'adresse '&' auquel est accollé un nom de variable (celle-ci doit bien sûr avoir été définie avant...) :

Nom_du_pointeur = &nom_de_la_variable_pointee;

Par exemple :

int a = 2;

char b;

int *p1;

char *p2;

p1 = &a;

p2 = &b;

Accéder à une variable pointée

Après (et seulement après) avoir déclaré et initialisé un pointeur, il est possible d'accéder au contenu de l'adresse mémoire pointée par le pointeur grâce à l'opérateur '*'. La syntaxe est la suivante :

*pointeur

Par exemple :

int a = 2;

*p1 = 10;

*p2 = 'a';

Après ces deux instructions, le contenu des variables p1 et p2 sera respectivement 10 et 97 (61 en hexadécimal, le code ASCII associé au caractère 'a').

Si vous désirez utiliser cette notation dans une expression plus complexe, il sera nécessaire d'employer des parenthèses :
Par exemple :

a = (*p) + 2;

Passage d'argument à une fonction par adresse

Lorsque l'on passe une variable en paramètre d'une fonction, cette dernière utilise une copie de la variable lorsqu'elle effectue des opérations sensées la modifier, c'est-à-dire qu'en sortie de la fonction, une variable passée en paramètre n'est pas modifiée. Cela provient du fait que les variables utilisées dans la fonction ont comme portée la portée de la fonction. Or une variable ne peut être manipulée que dans la portée dans laquelle elle est définie...

Une première solution consiste à retourner la valeur de la variable modifiée et de la stocker par affectation dans la variable :
Par exemple :

int Ajout2(int a){
a +=2;

return a;

}

int b = 3;

b = Ajout2(b);

Toutefois, il se peut que l'on destine le retour de valeur à une autre opération, auquel cas l'astuce ci-dessus n'est plus suffisante.

Une solution consiste à utiliser un pointeur vers la variable en paramètre, on parle alors de passage de paramètres par pointeur ou passage de paramètres par adresse. De cette façon la fonction est à même d'accéder directement à la variable, donc de la modifier. Pour cela, il s'agit de déclarer un paramètre de type pointeur, et passer l'adresse de la variable au lieu de passer la variable elle-même comme dans le cas du passage de paramètre par valeur.

L'exemple précédent ressemblerait alors à ceci :

int Ajout2(int * a){
*a +=2;

}

int b = 3;

Ajout2(&b);

Passage d'argument par référence

Le langage C++ apporte les avantages du passage par pointeur avec la simplicité du passage par valeur grâce au concept novateur de référence. Une référence (n'ayant aucun sens en langage C) permet de faire « référence » à des variables existant dans une autre portée, par exemple manipuler une variable située dans une fonction à partir d'une autre fonction.

La déclaration d'une référence se fait simplement en intercalant une esperluette (le caractère &, appelé aussi ET commercial) entre le type de la variable et son nom :

type & Nom_de_la_variable = valeur;
  • Une référence doit obligatoirement être initialisée lors de sa déclaration !
  • Le concept de référence ne doit en aucun cas être confondu avec celui d'adresse même si les deux notions utilisent le caractère &

    Le passage par référence consiste tout simplement à définir une référence pour une variable et de la passer en paramètre d'une fonction.

    Voici l'exemple précédent mettant en œuvre l'utilisation de référence :

    int Ajout2(int &);
    
    int Ajout2(int & a){
    a +=2;
    
    }
    
    int b = 3;
    
    Ajout2(b);


    Dernière modification le mardi 14 octobre 2008 à 17:40:30.Ce document intitulé « Langage C++ - Les pointeurs » issu de Comment Ça Marche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Langage C pointeurs, creation de liste. (Résolu) Bonjour a tous. Voila, je rencontre quelaues petits preoblemes en langage C. Le but est de creer des fiches afin de creer une listes les contenant. Il faut ensuite afficher ce que l on a entre dans chaque fiche, puis afficher enfin le nombre de fiches... www.commentcamarche.net/forum/affich-2170245-langage-c-pointeurs-creation-de-liste
Introduction au langage C Petite histoire du C Le langage C a été mis au point par D.Ritchie et B.W.Kernighan au début des années 70. Leur but était de permettre de développer un langage qui permettrait d'obtenir un système d'exploitation de type UNIX portable. D.Ritchie... www.commentcamarche.net/contents/c/cintro.php3
Les pointeurs en langage C Définition d'un pointeur Un pointeur est une variable contenant l'adresse d'une autre variable d'un type donné. La notion de pointeur fait souvent peur car il s'agit d'une technique de programmation très puissante, permettant de définir des... www.commentcamarche.net/contents/c/cpoint.php3
[Langage C] C/C++ Erreur de segmentationQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux... www.commentcamarche.net/faq/sujet-4791-langage-c-c-c-erreur-de-segmentation
Les files en langage CLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un... www.commentcamarche.net/faq/sujet-8282-les-files-en-langage-c
Les piles en langage CLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage... www.commentcamarche.net/faq/sujet-8283-les-piles-en-langage-c
Language C: Tirez un nombre au hasard ... (Résolu)Bonjour, Je suis en train de créer mon 1er jeu avec le langage C. Je bloque au moment ou arrive mon 1er combat. Voila mon bout de code bourré de faute: printf("Alors que vous etiez sur le point de vous enfuir, un gobelin vous barre la sortie !");... www.commentcamarche.net/forum/affich-11115895-language-c-tirez-un-nombre-au-hasard
Passage de paramètres (language C)Bonjour, J'ai un petit problème en language C. Comment dois-je transmettre un tableau déclaré dans le main à une fonction en utilisant les indices et non les pointeurs ? void chargertableau (int); void main() { int tab[5][5]; chargertableau(?????);... www.commentcamarche.net/forum/affich-3779305-passage-de-parametres-language-c
Exec en langage C (Résolu)Bonjour à tous. J'écris un programme en langage C permettant de créer un fichier de config (pour MRTG). Pour cela je dois utiliser la primitive "exec", la commande que je souhaite lancer ressemble à : snmpgetnext -c community IPadress OID. Comment "... www.commentcamarche.net/forum/affich-1623603-exec-en-langage-c
Langage C++Histoire du C++ Le langage C++ est une « amélioration » du langage C (le langage C a été mis au point par M.Ritchie et B.W.Kernighan au début des années 70). Bjarne Stroustrup, un ingénieur considéré comme l'inventeur du C++, a en effet décidé... www.commentcamarche.net/contents/cpp/cppintro.php3
Langage C++ - Les types de donnéesLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître... www.commentcamarche.net/contents/cpp/cpptype.php3
Langage C - Les types de donnéesLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le... www.commentcamarche.net/contents/c/ctype.php3