![]() |
Unterschied? (PChar)
hi,
da ich gelesen hab das eine variable vom Typ PChar immer gleich gross ist, frage ich mich was der unterschied zwischen:
Delphi-Quellcode:
und:
procedure TForm1.Button1Click(Sender: TObject);
var p: PChar; begin p := 'bla'; ShowMessage(p); end;
Delphi-Quellcode:
bzw was der vorteil an letzterem sein soll?
procedure TForm1.Button1Click(Sender: TObject);
var p: PChar; begin p := StrNew('bla'); ShowMessage(p); StrDispose(p); end; Meine zweite frage ist, wozu es PChar überhaupt gibt, kann es irgendwas, was mit nem String nicht geht? |
Re: Unterschied? (PChar)
Moin.
Kann man nicht wirklich vergleichen, denke ich. Ein String ist eine Zeichenkette. Eine Art Array, beginnend mit dem Index 0 und das ende wird markiert durch NULL (nullterminierte Strings). PChar ist ein Zeiger (Pointer) auf einen Char-Wert. Kannst ausführlich in der Hilfe nachlesen. Bis denne... |
Re: Unterschied? (PChar)
Seit Delphi 2 sind die Strings in Delphi auch nur mehr Zeiger auf die Zeichenkette (-> SizeOf(String) = 4!!). Außerdem hat das erste Zeichen den Index 1 und das letzte Zeichen den Index Length(String)! Der einzige Unterschied ist, dass die Delphi-Strings noch 2 interne Zähler mitführen (Längenzähler und Referenzzähler). Natürlich erleichtert der Compiler die Arbeit mit den Delphi-Strings enorm, da er automatisch alle möglichen nötigen Zwischenschritte komplett transparent vornimmt und man sich so nicht mehr darum kümmern muss. Aber vom Aufbau her sind Delphi-Strings und PChars gar nicht so unähnlich..!
|
Re: Unterschied? (PChar)
Hi,
wie bereits gesagt, ist ein PChar ein Pointer auf ein Character. Zu bemerken ist, dass ein PChar, immer so groß ist wie die Speicheradresse (wenn ich mich nicht täusche, dann ist das 4 Byte). Ein Pointer ist also eigentlich ein integer, in dem die Speicheradresse zum eigentlichen Inhalt liegt. Chris PS: So habe ich es zumindest gelernt. ;) |
Re: Unterschied? (PChar)
danke für die beschreibung :). kann mir dann noch jemand sagen was der unterschied zwischen meinen 2 beispielen ist?
|
Re: Unterschied? (PChar)
@Chakotay: korrekt.. Windows kann 4GB Speicher adressieren (2^32 Bytes), um also denn gesamten Speicher adressieren zu können braucht man einen Zeiger mit 32Bit "Bandbreite". Und 32Bit sind eben 4 Bytes...
@silent: der Unterschied... Dank der erweiterten String-Syntax reserviert Delphi im ersten Beispiel den Speicher selbst (völlig transparent), wogegen du im 2ten Beispiel diesen Schritt selbst machst. Und nachdem du den Speicher selbst reservierst musst du (was du auch brav getan hast ;)) den Speicher auch selbst wieder freigeben... |
Re: Unterschied? (PChar)
Zitat:
Im ersten Beispiel setzt der Compiler den PChar p auf die Adresse, an der die hard-coded Zeichenkette 'bla' steht. Und diese liegt in einem schreibgeschützten Speicherbereich. Es wird also kein Speicher durch Compiler Magic reserviert. Folgendes Beispiel verdeutlicht das am besten:
Delphi-Quellcode:
var
P: PChar; begin P := 'Test'; P[0] := 'F'; // <-- Schutzverletzung. end; |
Re: Unterschied? (PChar)
Ich rede von der "erweiterten String-Syntax", nicht von Strings allgemein. Die erweiterte String-Syntax erleichtert das Arbeiten mit Kombinationen Strings <-> PChars...
Allerdings könntest du damit recht haben, dass kein Speicher reserviert wird.. anscheinend hab ich da was falsch in Erinnerung.. *grübel* |
Re: Unterschied? (PChar)
danke , gut erklärt :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz