Announcement

Collapse
No announcement yet.

Zeiger verwenden WANN?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeiger verwenden WANN?

    Hallo,<br><br>
    stimmt es, daß Zeiger verwendet werden, weil sie weniger Speicher verbrauchen, wie gewöhnliche Variablen?<br>
    Es muß aber doch dem Zeiger ein Wert aus einer bestehenden Variablen zugewiesen werden (A:= @B). Also ist doch sicher Speicher für die Variable <b>B </b>belegt. Und dann wird für <b>A</b> auch noch Speicher für die Adresse von <b>B </b> reserviert.<br>
    Was bringt es in einer Routine statt der Variablen, die ohnehin bereits definiert ist, mit Zeigern auf Varibalen zu arbeiten.<br><br>
    Freue mich auf Eure Antworten<br>
    Uwe

  • #2
    Zeiger lohnen immer dann wenn in mehreren Stellen im Programm auf die gleichen Strukturen zugegriffen werden muß. <br>
    Alle normalverwendeten Objecte SIND Zeiger. <br>
    Z.b. From1 zeigt auf das allozierte Object vom typ TForm1.
    Ein Event wie TForm1.ListBoxChange(Sender: TObject); zeigt mit dem zeiger Sender auf die auslösenden TListBox.
    <br>

    Ein zeiger nutzt 4 bytes -> 1 LongWord = 1 register wie EAX,EDX,...
    Einzeiger auf Daten mit z.B. 1 Mb Größe verbraucht also 1 register. Wird der zeiger in einer Funktion übergeben wird er also direkt in einem Register abgelegt und NICHT auf dem Stack. Wird OHNE Zeiger gearbeitet werden die 1 Mb Daten jeweils auf dem Stack kopiert und so eine lokale Kopie benutzt. Dadurch würden NICHT die orginalen Daten bearteitet.

    <pre>

    procedure EditDaten(Daten: array[1Mb]); // speichert in Stack
    procedure EditDaten(var Daten: array[1Mb]); // übergibt einen zeiger auf Daten

    </pre>

    Zeiger sind somit die meistverwendeten Typen wenn mit Daten/Records/Objecten/Floats gearbeitet wird.
    Zeiger SIND also die Addresse des Speicherbereiches an dem die Daten stehen.

    Beispiele in denen Zeiger verwendten werden:

    <pre>

    procedure Calc(var Data);
    procedure FindControl(Wnd: hWnd): TControl; // Result ist Zeiger

    var
    S: String;

    S := S + 'A';
    Delete(S, 1, 1);
    S := S + S;

    SetLength(S, 0);
    S := '';

    </pre>

    gruß Hage

    Comment


    • #3
      Hallo Hagen,<br><br>
      herzlichen Dank für die prompte Info.<br>
      Gibt es "verständliche" Lektüre über dieses Thema?<br><br>
      Uw

      Comment

      Working...
      X