forumnewbie schrieb:
Danke für den Hinweis!
Also ich habe das jetzt folgendermaßen verstanden: mit dem Adressoperator (&) erhalte ich die Stelle im Arbeitsspeicher, wo eine Variable liegt. Wenn ich wissen will, welcher Wert unter dieser Adresse im Arbeitsspeicher gespeichert ist, dann benutze ich den Dereferenzierungsoperator (*).
Wenn ich also einem Zeiger eine Variable zuweisen will, dann muss ich das über ihre Adresse im Arbeitsspeicher machen, deshalb:
int varp* = &var;
So ist's richtig:
int *varp = &var;
forumnewbie schrieb:
Und beim Array klappt die Zuweisung ohne Adressoperator, weil das Array a automatisch auf die Adresse des ersten Elements zeigt. Deshalb ist:
int a[] = {0, 1, 2, 3, 4, 5, 6};
int *p = a;
dasselbe wie:
int *p = &a;
Bin mir jetzt nicht sicher, ob das erlaubt ist. Richtig ist jedenfalls: Der Name eines Arrays ohne Indexoperator ist die Adresse des ersten Elements. Er kann wie ein Zeiger benutzt werden außer, daß er KEIN LVALUE ist, also nicht verändert werden kann.
forumnewbie schrieb:
Wenn ich eine Adresse eines Zeigers (und Arrays) herausfinden will, dann brauche ich keinen Adressoperator mehr, da ein Zeiger selbst die Adresse des ersten Elements ist:
printf("p: %d\n", p);
Array ohne Indexangabe ist ebenfalls einfach die Adresse des ersten Elements, der in dem Array gespeichert ist.
Fast. Ein Zeiger ist eine ganz normale Variable und hat deshalb auch eine Adresse, die mit dem Adressoperator ermittelt werden kann.
forumnewbie schrieb:
Will ich jetzt den Wert vom ersten Element haben, dann kann jetzt den Dereferenzierungsoperator verwenden:
printf("Element 0: %d\n", *p);
Oder einfach:
printf("Element 0: %d\n", a[0]);
Nur bei einer Variable benötige ich den Adressoperator, wenn ich ihre Adresse anzeigen will:
printf("var: %d\n", &var);
Habe ich das jetzt alles richtig aufgeschrieben bzw. verstanden?
Für Adressen wird das Format %p benutzt.
printf("var: %p\n", &var);
Das ist vor allen auf 64-Bit-Systemen wichtig, wie ich schon mal schrieb.,
Ansonsten, Du bewegst dich jedenfalls in die richtige Richtung.
Das Problem, warum das so viele durcheinander bringen ist, daß
1. Der Name des Arrays wie ein Zeiger benutzt werden kann
2. Funktionen kein Array übergeben bekommen, sondern nur deren Adresse.
Deshalb bringen viele die Begriffe Array, Adresse und Zeiger durcheinander.
Ein Zeiger ist aber ein LValue, ein Array aber nicht. LValues haben grundsätzlich Adressen, die mit dem Adressoperator ermittelt werden.
mfg Martin