Dämliche Pointer Frage

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Gary12345
Beiträge: 2
Registriert: Sa 15. Jun 2013, 20:01

Dämliche Pointer Frage

Beitrag von Gary12345 »

Code: Alles auswählen

var
  i, j: Integer;
  p1: ^Integer;
  p2: Pointer;
begin
  i := 1;
 
  { typisiert }
 
  p1 := @i;       // dem Zeiger wird die Adresse der Integer-Variable übergeben
  p1^ := p1^ + 1; // hier wird der Wert um eins erhöht
  j := p1^;       // typisiert: der Variable j wird 2 übergeben
 
  { untypisiert }
 
  p2 := @i;       // analog oben
  Integer(p2^) := i + 1;
  j := Integer(p2^);
end.
Zu diesem Codestück:

Code: Alles auswählen

  p1 := @i;       // dem Zeiger wird die Adresse der Integer-Variable übergeben
  p1^ := p1^ + 1; // hier wird der Wert um eins erhöht
  j := p1^;       // typisiert: der Variable j wird 2 übergeben
der Variable p1 wird die Speicheradresse von i zugewiesen. J besitzt nun den Wert 2. D.h. ein Zeiger ist ein Objekt, der die Speicheradresse mit Hilfe von @ ermittelt und dann den Wert der Variable speichert? Und dazu wird die Variable i auch noch um 1 erhöht? Warum das?

Wäre über eine Erklärung sehr dankbar!
Zuletzt geändert von Lori am So 16. Jun 2013, 11:39, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Dämliche Pointer Frage

Beitrag von Michl »

Aber es ist doch genau so, wie Du es geschrieben hast:

P1 und P2 sind Pointer!

bei

Code: Alles auswählen

p1 := @i;
übergibst du die Adresse, die i besitzt auf P1. Das bedeutet P1 und i zeigen auf den gleichen Speicher!

Alle Operationen, die du jetzt mit P1^ bzw. integer(P2^) durchführst könntest du auch mit i durchführen, da immer der gleiche Speicherbereich genutzt wird!

im Prinzip ist

Code: Alles auswählen

p1^ := p1^ + 1;
gleich

Code: Alles auswählen

i := i + 1;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Dämliche Pointer Frage

Beitrag von DonMigos »

Gary12345 hat geschrieben:D.h. ein Zeiger ist ein Objekt, der die Speicheradresse mit Hilfe von @ ermittelt und dann den Wert der Variable speichert?

Nein ein Zeiger ist kein Objekt, er kann aber auf ein Objekt verweisen. Ein Zeiger ist eine Adresse, mit der man zu dem adressierten Speicherbereich gelangt.

Steht hier auch ganz schön:
Mit Zeiger (auch englisch pointer) wird in der Informatik ein spezieller Wert bezeichnet, dessen Bedeutung eine Speicheradresse ist. An dieser Adresse können entweder Daten, wie Variablen oder Objekte, aber auch Programmcode, stehen. Durch Dereferenzierung des Zeigers ist es möglich, auf die Daten oder den Code zuzugreifen. http://de.wikipedia.org/wiki/Zeiger_%28Informatik%29
Mit dem @ wird hier nur die Adresse von i an den pointer p1 übergeben. Da wird nichts großartig ermittelt, es findet nur ein Kopiervorgang statt.
In Assembler sieht das dann so aus:

Code: Alles auswählen

mov    %eax,-0x14(%ebp)
Das wars schon, mov ist ein einfacher Kopierbefehl.
Gary12345 hat geschrieben: Und dazu wird die Variable i auch noch um 1 erhöht? Warum das?

Das war hier sicher nur um den Umgang mit Pointern zu veranschaulichen, man hätte das ganze auch um 7 erhöhen können oder sonst was mit machen können.

Code: Alles auswählen

p1^ := p1^ + 1;
Das ^ bedeutet hier, das eine Dereferenzierung von p1 statt findet, es wird dadurch auf den Speicherbereich zugegriffen, auf den der Zeiger p1 zeigt. So kann man den Integer Wert (in diesem Fall) ereichen und um 1 erhöhen (oder anderes damit machen).

Hoffentlich ist es jetzt etwas klarer.

Hier noch zwei Links zum Thema:
http://docwiki.embarcadero.com/RADStudi ... eigertypen
http://www.entwickler-ecke.de/topic_Poi ... 926,0.html

MfG

Gary12345
Beiträge: 2
Registriert: Sa 15. Jun 2013, 20:01

Re: Dämliche Pointer Frage

Beitrag von Gary12345 »

Danke! Habe alles verstanden!

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Dämliche Pointer Frage

Beitrag von MmVisual »

Wenn man die Adresse eines Zeigers als Integer Zahl merken möchte, so sollte der Variablentyp PtrInt sein und nicht Integer:

Code: Alles auswählen

Var i = PtrInt;
  p: Pointer;
 
i := PtrInt(p);
Warum?
Weil die Adresse bei 32 Bit Systemen 32 Bit groß ist, bei 64 Bit Systemen 64 Bit. Um je nach Compiler automatisch die richtige Variablendeklaration zu haben, gibt es den Typ PtrInt.

(Hat jetzt nicht direkt was mit der eigentlichen Frage zu tun, sollte man aber wissen.)
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten