Table des matières indexe chapitre suivant

Chapitre 9 : Manipulation des pointeurs

Une variable pointeur de type T est une variable destinée á contenir une référence vers un réceptacle de type T. Comme toute variable, une variable de type pointeur n'est pas initialisée lors de sa déclaration. L'initialisation doit apparaître dans la partie instruction sous l'une des formes suivantes :
Soit p un pointeur de type T

  1. p := nil indique que le pointeur p ne "pointe" vers aucun réceptacle.
  2. new(p) crée un réceptacle de type T et met l'adresse de celui­ci dans p :


    La création du réceptacle est faite lors de l'exécution du programme; c'est ce qu'on appelle allocation dynamique explicite. Comme les réceptacles ainsi crées peuvent recevoir une valeur, on les appelle parfois variables dynamiques, malgré le fait que, contrairement aux autres variables (variables statiques, déclarées dans une partie déclaration de variables), ils ne sont pas associés á un nom. Les réceptacles créés par allocation dynamique explicite (variables dynamiques) ne peuvent être accédés que via des pointeurs; les variables déclarées dans une partie déclaration de variables (variables statiques) ne peuvent jamais être accédées, dans un programme PASCAL, via des pointeurs.


    L'espace mémoire alloué dynamiquement doit être géré par le programme lui­même. On peut affecter á une variable pointeur de type T la valeur d'une autre variable pointeur de type T; on peut tester l'égalité (ou l'inégalité) des valeurs de variables pointeurs de même type. Lorsqu'une variable dynamique n'est plus utilisée dans la suite du programme, il convient de libérer explicitement l'espace mémoire alloué dynamiquement afin de pouvoir le réutiliser ultérieurement.
    dispose (p)
    a pour effet de libérer l'espace mémoire du réceptacle pointé par p.

    Exemples

        type nombre = integer;
             link = ^nombre;
        var p : link;
            x : nombre;
        begin
            x := 5;
            p := ^x; {erreur á la compilation : x n'a pas été allouée dynamiquement}
            writeln (p^);
            ...
        end.
        type p = ^person;
             person = record 
                name : packed array[1..10] of char;
                link : p
            end;
        var x,y : p;
        begin
            new(x);
            x^.name := ´toto      ´;
            new(x^.link);
            y := x^.link;
            y^.name := ´roberto   ´;
            y^.link := nil; {***}
            ...
            dispose(y); dispose(x);
            ...
        end.

    Situation au point *** :


    Table des matières indexe chapitre suivant