vendredi 29 avril 2016

Langages avec et sans pointeurs

Langages sans pointeurs[modifier | modifier le code] Certains langages ne permettent pas l'utilisation explicite de pointeurs. La majorité des langages de programmation utilisent (ou au moins permettent) le passage de paramètres par valeur. Typiquement, si n est un entier, alors l'appel de fonction f(n) ne pourra pas modifier n même si dans le code de la fonction, l'argument est incrémenté. La raison est que la valeur de la variable n est d'abord copiée, si bien que la fonction f peut lire et écrire cette copie de la variable n, mais ne peut pas modifier la variable n originale. Avec les pointeurs, il devient possible de passer en argument d'une fonction l'adresse d'une variable, et ainsi d'accéder en lecture et en écriture à la variable originale, et ce dans le code de la fonction. Dans la plupart des langages de programmation sans pointeurs, par exemple Python, Java ou Javascript/Actionscript, les variables ou objets sont toujours passés par valeur, mais l'accès aux champs de ces objets se fait par référence ou par adresse. Typiquement, si o est un objet, alors f(o) ne pourra modifier o, mais pourra modifier (s'ils existent) les champs de o, par exemple s'il existe le champ o.taille de l'objet o original pourra être incrémenté dans le code de la fonction. Ainsi, en passant par référence / adresse les champs des objets, c'est-à-dire en modélisant un objet comme étant une liste de références / pointeurs sur ses champs, il devient possible d'implémenter toutes les structures de données qui nécessitent des pointeurs tels que les arbres, les listes chaînées, etc... Pour ce qui est des tableaux, tout fonctionne comme si les tableaux étaient des objets possédant un opérateur [], l'écriture tab[i] donnant accès au champ i de l'objet tab. Dans une fonction prenant en argument un tableau, il est donc (uniquement) possible de modifier les éléments du tableau. Mais certains langages fonctionnent différemment. En PHP, les variables ou objets peuvent être au choix passés par valeur/copie ou par référence/adresse, en utilisant au choix la syntaxe f(&$n) au lieu de f($n). Langages utilisant les pointeurs[modifier | modifier le code] Les pointeurs sont, entre autres, utilisés par les langages suivants (liste non exhaustive) : C, C++, Pascal, Ada, FreeBASIC, Fortran, C#, D, Modula-2, Oberon et, bien sûr, tous les assembleurs. Assembleur[modifier | modifier le code] Un assembleur (langage d'assemblage) ne connaît en fait que deux notions pour stocker des données : les registres (assimilables à des variables globales), et les adresses mémoire. Un pointeur est une adresse mémoire qui contient une autre adresse mémoire. Ce qui fait que pour accéder à une donnée pointée par un pointeur (en lecture ou écriture), il faut deux accès mémoire : le premier pour lire l'adresse elle-même, le second pour l'accès à la donnée qui y est stockée. Un assembleur dispose presque toujours d'une instruction permettant d'indiquer l'accès à une donnée via un pointeur : en général, le pointeur est entre parenthèses, ce qui indique de traiter la donnée à l'adresse indiquée par le pointeur, au lieu de l'adresse elle-même. Le double accès-mémoire est alors implicite. Un tel langage est tellement proche de la machine qu'il est quasiment impossible de se passer de la notion de pointeur, en particulier pour stocker des données de taille variable. C et C++[modifier | modifier le code] Les deux principaux langages utilisant énormément les pointeurs sont le C et le C++. Dans ces langages, un pointeur est déclaré avec une étoile « * » postfixée au type pointé. L'adresse d'une variable est récupérée avec une esperluette « & » préfixée à la variable. L'étoile sert également à déréférencer un pointeur, c'est-à-dire à accéder à la variable pointée par le pointeur, mais alors elle est préfixée à la variable. int n = 2; // Déclaration de la variable n, de type entier, initialisée avec la valeur 2. int* p = &n; // Déclaration de la variable p, de type pointeur d'entier, initialisée avec la valeur « adresse de la variable n ». *p = 5; // Déréférencement de la variable p, pour affecter la valeur 5 à la variable n ; maintenant la variable n vaut 5.

Aucun commentaire:

Enregistrer un commentaire