Zeiger
lima-city → Forum → Programmiersprachen → C/C++ und D
adresse
array
bit
code
compiler
einziges byte
element
ergebnis
feld
first
folgende ausgaben
folgenden code
meckern
operator
pointer
system
typ
zahl
zeiger
zuweisung
-
Hi, ich hab hier folgenden Code
int a[2], *first; a[0]=1; a[1]=2; first = &a; printf("%i,%i",*(first+1)); ergebnis = 2
int a[2], *first; a[0]=1; a[1]=2; first = a; printf("%i,%i",*(first+1)); ergebnis = 2
Warum wird in beiden Fällen die 2 Ausgegeben?
Im ersten Fall zeigt der Pointer auf die Adresse, wo das Array liegt.
Im Zweiten Fall hätte ich jetzt gedacht, dass das erste Element des Arrays also die 2 dem Pointer zugewiesen wird. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Also die Variable a ist ja ein Array und das wird intern als Pointer gespeichert. a enthält also die Adresse, an der das Array beginnt. Im ersten Codeschnipsel weist du "first" also mit dem '&'-Operator einen Zeiger auf ein Array zu. Wahrscheinlich hat dein Compiler diesen Zeiger zu einem int-Array implizit zu einem Zeiger zu einem int umgewandelt, weil aber der Zeiger auf das Array den gleichen Wert erhält wie das Array an sich, kann *(first+1) problemlos ausgewertet werden und zwar eben zu dem zweiten Wert im Array: 2
Im zweiten Codeschnipsel weist du dem Zeiger first die Adresse vom Array zu und somit zeigt auch first auf den Arrayanfang und deshalb wird *(first+1) genauso zu 2 ausgewertet. -
also, das zweite quellcode-stück ist richtig. im ersten ist ein fehler drin. da müsste der compiler eigentlich meckern. bei
mir tut er es. Da passt der typ nämlich nicht!
-first ist vom typ int *
-&a ist vom typ int **, da a vom typ int * ist, und &a, die adresse von a ist. also quasi einen zeiger auf einen zeiger :-)
Arrays sind in C/C++ nichts anderes als Zeiger!
a: Speicheradresse in der das Element 0 des Feldes gespeichert wird.
a+1: Speicheradresse in der das Element 1 des Feldes gespeicher wird.
Die Zuweisung 'first = a;' ist demnach richtig.
*a: Wert des Elementes 0 des Feldes.
*(a+1): Wert des Elementes 1 des Feldes.
Kannst ja folgende Ausgaben machen. Dann wird es dir klarer (denke ich^^) :
printf("\n%i\n%i\n", a, a+1); printf("\n%i\n%i\n", &a[0], &a[1]);
In beiden Fällen werden die Adressen der beiden Feldelemente ausgegeben. Da der Typ Integer
auf einem 32-Bit system den Speicherplatz von 4 Bytes einnimmt und da jede Speicheradresse immer
jeweils 1 einziges Byte adressiert, werden die Adressen der Feldelemente um die Zahl 4 auseinander liegen.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage