Wir könnten jetzt wetten wer recht hat 
Von der Logik her betrachtet würde ich
eher sagen auf dem, doch recht begrenzten
Stack, würde nur ein Idiot Daten ablegen,
eher ein Pointer auf irgendwas irgendwo
im Speicher,
ist viel effizienter, du willst ja kein
Stack Overflow…
Prozedurparameter landen nun einmal auf dem Stack, ebenso die lokalen Parameter einer Prozedur. (Wir reden jetzt von Arrays of Char, nicht von Huge Strings o.ä.)
Also, noch einmal: PChar ist nun einmal ein Pointer:
Var P: PChar; A: Array[0…11] of Char
Auf die Elemente von P beziehe ich mich, indem ich P dereferenziere:
P^[2] := ‚a‘
auf die Elemente von A kann ich mich direkt beziehen, da gibt es nichts zu dereferenzieren:
A[2] := ‚a‘
Ein Array of Char ist definitiv kein Pointer auf ein Array of Char - davon beisst die Maus doch keinen Faden ab!
Wenn du aber einen PChar übergibst, wird
die Adresse des Pointers auf ein Array of
Char übergeben, wenn du ein Array of Char
übergibst, wird dessen Adresse übergeben.
Trotzdem haben wir’s mit nem PTR zu tun
NEIN NEIN NEIN!
Wenn ich schreibe:
Type CharArr: Array [0…9] of Char;
Var P: PChar; A: CharArr;
dann wird bei
Procedure A(Var P: PChar);
die Adresse des Pointers auf den Stack gelegt (also eine zweifache Referenz!). Bei
Procedure B(P: PChar);
kommt der Pointer auf den Stack, bei
Procedure C(Var A: CharArr);
wird die Adresse des Arrays auf den Stack gelegt (das könnte man als Pointer bezeichnen - ist es aber im Sinne von Pascal bzw. Delphi nicht) und bei
Procedure D(A: CharArr);
landet das gesamte Array auf dem Stack!
M.W. sollte das jeweils den folgenden VB-Aufrufen entsprechen:
Sub A(ByRef S as String) ’ mit Einschränkungen!!!
Sub B(ByVal S As String)
Sub C(ByRef S As String*10)
Sub D(ByVal S As String*10)
(Fall A dürfte nicht funktionieren, da die Art der Verpointerung in VB eine andere ist und VB-Strings noch ein Wort am Anfang als Längenzähler mitführen).
Reinhard