AW: In welchem Zusammenhang steht Deien Frage?
Uwe
Nun, Micha,
Deien Erinnerung trügt Dich bestimmt nicht, denn ich kann mir nicht vorstellen, dass eine C/C++-Vorlesung nicht sehr rasch zum Instrument des Pointers vordringt.
Vielleict hast Du aber eine Vorleseung versäumt, denn das Prinzip des Pointer ist relativ simpel, wenn man es mit anderen Worten beschreibt und nicht gleich in die Besonderheiten der Operationen mit Pointers eindringt.
Wo allerdings bei VBA besonders von Pointer die Rede ist, weiß ich nicht; verwendet werden ein Pointer indirekt, durch die Übergabe eines Wertes ByRef (Übergabe bei Referenz).
Eine einfache Referenz (oder eben ein Pointer) ist nicht anderes, als eine Variable, die die Adresse des Beginns eines Speicherplatzes enthält, an dem der Start des Inhaltes der eigentliche Variable/Struktur bzw. des Arrays beginnt.
Ein Pointer in C/C++ ist also wie eine Variable zu deklarieren, also auch mit der Information des Datentyps, auf den der Zeiger weisen soll. Dadurch "behinhaltet der Pointer das Wissen", wie groß der Speicherbereich eines Elementes ist, auf den er verweist.
Hat z.B. der Datentyp double einen Platzbedarf von 8 Bytes, so kann eine Pointer vom Typ double angelegt werden ( double *ptrd in C/C++; *** ByRef prtd as Double, wobei *** für verschiedene Deklarationstypen oder Aufrufe steht).
Diese Variable, der Pointer, belegt im Speicher einen Platz, der ausreicht, um die Größe der Adresse einer beliebigen Speicherstellung je nach Modell, aufnehmen zu können. Nun unterscheidet sich C/C++ und VBA-Basic vermutlich grundlegend. Für das weiter Verständnis hier, genügt es festzustellen, dass, sobald eine Variable deklariert oder angelegt/übergeben wird, ein Speicherplatz gesucht wird, in dem der Wert der Variablen geschrieben wird und gleichzeitig die Adresse in dem Zeiger notiert wird.
Soweit sollte der Zeiger verständlich sein, er ist der "Schlüsselcode" zum Auffinden des Variablenwert bzw. dessen Speicherplatz selbst.
Wird nun ein Parameter ByVal an eine Unterroutine übergeben, so wird in der Unterroutine ein Duplikat angelegt; es existieren also zu diesem Zeitpunkt des Ausführens der aufgerufenen Routine mindesten zwei Speicherstellen, die die Varibale enthält. Im Unterprogramm wird nun nur die Kopie benutzt, die nach beendigung des Progamms "verschwindet" (Speicherplatz der Kopie wird freigegeben), während die Ursprungsvariable, die als Kopie übergeben wurde nicht angetastet wurde und somit weiterhin den Wert behält, den sie beim Aufruf des Unterprogrammes hat.
Anders ist es, wenn ich den Pointer/Zeiger übergebe (ByRef.. Standard in VBA), dann wird, das der eigentliche Variablenwert indirekt über den Inhalt des Zeigers angesprochen wird, in der Unterfunktion verändert.
Sub main()
Dim ptr As Double, val As Double
Dim text As String
ptr = 5#
val = 5#
Cells(1, 1) = Str(ptr) + " = ptr in Main vor Aufruf CallByRef"
Cells(2, 1) = Str(val) + " = val in Main vor Aufruf CallByVal"
Call CallByRef(ptr)
Call CallByVal(val)
Cells(7, 1) = Str(ptr) + " = ptr in Main nach Aufruf CallByRef"
Cells(8, 1) = Str(val) + " = val in Main nach Aufruf CallByVal"
End Sub
Sub CallByRef(ByRef ptr As Double)
ptr = 2 * ptr
Cells(4, 1) = Str(ptr) + " = ptr in CallByRef"
End Sub
Sub CallByVal(ByVal val As Double)
val = 2 * val
Cells(5, 1) = Str(val) + " = value in CallByVal"
End Sub
Ich hoffe, die notwendigenInformationenzur Beantwortung Deiner Fragen gegeben zu haben. Über Zeigerarithmetik habe ich hier geschwiegen, da sie in VBA meines Wissens nach ohne Bedeutung für die programmierung via VBA ist.
Gruß!