Thomas wrote:
> Ok Danke!
Eignetlich ist die Sache sehr einfach:
Hat man einen Pointer
int * pPtr;
dann liefert der Audruck *pPtr den int. Die Definition der
Variablen spiegelt also in einer gewissen Art und Weise
die Verwendung wieder:
int * pPtr;
^ | |
| | |
| +----+
| Dieser Ausdruck liefert
| das hier -+
| |
+--------------+
int j;
j = *pPtr;
bzw. auch umgekehrt:
*pPtr = j;
Mittels des Derefernzierungsoperators * gelangt man also immer
zu dem Datenwert auf den der Pointer zeigt:
pPtr j
+--------+ +-----+
| o------------------------>| |
+--------+ +-----+
Der * macht also nichts anderes, als dem Pfeil zu folgen,
der von der Pointervariablen ausgeht.
Nun gibt es aber auch Fälle, wie den den du hast:
struct abc
{
int k;
int l;
} test;
struct abc* pPtr;
pPtr = &test;
pPtr test
+--------+ +-------+
| o------------------------>| k: |
+--------+ +-------+
| l: |
+-------+
Ausgehend von pPtr, verfolgt ein vorangestellter * wiederrum
dem Pfeil
*pPtr
Am Ende des Pfeiles sitzt eine struct und um auf eine Komponente
so einer struct zuzugreifen benutzt man einen . so wie
man das zb in
test.k = 5;
machen würde.
Also:
*pPtr.k = 5;
Das hat jetzt aber einen Fehler. Der . bindet stärker als der *
So dass der Compiler das als
*(pPtr.k)
auffassen würde. Das ist aber ganz was anderes (und im jetzigen
Szenario illegal, weil pPtr ja keine struct ist).
Daher müsste man sowas immer als
(*pPtr).k = 5;
schreiben. Das ist aber eine mühsame Schreiberei. Da aber derartige
Konstruktionen oft vorkommen, hat man dafür einen eigenen Operator
eingeführt:
Anstelle von
(*pPtr).k
kann man auch
pPtr->k
schreiben. Und das ist dann schon etwas angenehmer zu tippen (und
zu lesen).