par , 16/02/2016 à 17h21 (567 Affichages)
On ne vous a jamais parlé d’allocation statique et pour cause ça n’existe pas vraiment, ou plutôt c’est que l’on fait la plupart du temps. Et comme on le fait tout le temps on n’y pense plus.
Ainsi lorsque vous définissez une variable en l’appelant « x » vous faites de l’allocation « statique ». Dans l’article précédent (notion de pointeur : une abtraction subtile) je vous ai dit qu’une variable comme « x » était synonyme de « adresse ». On peut en changer le contenu : « x » vaut 4 et puis on fait « x=6 » et maintenant le contenu de « x » vaut 6 et non plus 4. Mais l’adresse « x », elle ne peut pas changer. Seul le contenu de « x » peut changer. J’ai fait de l’allocation « statique ». Le compilateur a demandé au système d’exploitation la disponibilité d’une adresse et jusqu’à la fin du programme cette adresse est « réservée » à la variable « x » ; « x » est synonyme de cette adresse.
Vous allez maintenant comprendre les rapport étroits qui existe entre « pointeur » et « allocation dynamique ». Lorsqu’en C++ vous faites :
vous déclarez une variable “x” que vous initialisez à 4. Le compilateur et le système d’exploitation recherchent pour vous une adresse libre, associent définitivement (à la limite prés de la « portée » de la variable mais nous pouvons pour le moment oublier ce point qui compliquerait l’explication sur les pointeurs) la variable « x » à cette adresse et place la valeur 4 dans la case réservée à l’adresse en question.
Vous pouvez « prendre la main » sur le compilateur et décidez vous même de réserver une case mémoire en faisant comme ceci :
1 2
| int * ptr ;
ptr = new int ; |
Que signifie tout cela ? L’étoile « * » sert à définir une variable « pointeur » ; ici il s’agit d’un pointeur sur un entier. Si on avait voulu définir un autre pointeur ptr2 sur un double on aurait fait ceci
La deuxième ligne « ptr = new int ; » demande au compilateur de nous réserver une zone mémoire qui sera capable de stocker un entier.
Dans le cas de la variable « x » il suffisait de faire :
et on avait défini une variable entière nommée « x » initialisée à « 4 » et le compilateur s’occupait du reste, c’est à dire de réserver une zone mémoire faite d’une adresse équivalente à « x » et d’un contenu, ici « 4 ».
Dans le cas du pointeur c’est le programme qui doit le faire et il faut donc l’écrire ; la réservation ne se fait pas toute seule mais se fait par l’exécution de la ligne :
Ainsi on dispose d’une nouvelle variable et donc d’une nouvelle adresse (nous avons vu que cela était équivalent ) ; avant nous avions « x », maintenant nous avons « ptr » et dans les deux cas il s’agit bien d’une adresse. Vous me direz : « Alors tout ça pour ça ! Au final rien n’a changé et en plus c’est plus compliqué de faire un pointeur qu’une variable toute simple ». Les différences fondamentales sont les suivantes.
Pour accéder à la valeur contenu à l’adresse « x » on fait, par exemple pour y mettre « 6 » :
x = 6 ; // à l'adresse équivalente à x il y aura maintenant 6
Et pour « ptr » on doit faire :
1 2
|
*ptr = 6 ; // à l'adresse contenue dans ptr il y aura maintenant 6 |
En termes savants on appelle cela dé-référencer un pointeur.
Mais, alors que vous ne pouvez pas changer l’adresse « x », vous pouvez tout à fait changer l’adresse CONTENUE dans ptr en faisant par exemple :
ptr = ptr + 1 ; // attention ceci est dangereux et il faut bien savoir ce que l'on fait mais on y reviendra.
Cette ligne signifie que si ptr contenait par exemple l’adresse 3 641 325 elle contient maintenant l’adresse 3 641 326 et si je fais :
il y aura la valeur « 8 » à l’adresse 3 641 326 et il y aura toujours 6 à l’adresse 3 641 325 .
Bien sûr rien de tout cela n’est possible avec la classique variable « x ».
Vous avez maintenant compris la différence essentielle entre un “pointeur” obtenue par “allocation dynamique” et une variable classique, mais je comprends tout à fait que vous n’en voyez pas encore tout l’intérêt. Changer le contenu d’une variable, rien de plus naturel, mais vouloir changer le nom de la variable en cours de route, c’est à dire son adresse, cela semble plus dangereux qu’utile.
La suite va tenter de vous rassurer et peut-être de vous émerveiller !