2017-05-29 2 views
1

Ich bin derzeit ein Buch über C-Zeiger und gibt es ein Beispiel in dem Buch zu lesen, die mich verwirrt:Speicher in C zugehörige Arithmetik Zeiger

Angenommen, wir haben: int arr_of_int[] = {5,10,15}; und wir setzen: int *add_of_arr = arr_of_int;

dann weiß ich, dass die „add_of_arr“ Variable enthält die Adresse: arr_of_int[0]; und nehmen wir an, nur die Adresse „add_of_arr“ ist 500.

Nun, wenn ich tun: „add_of_arr += 3;“ dann die Adresse von "add_of_arr" ist jetzt 512? Das ist, was ich aus dem Buch bekomme, aber sollte die Adresse von "add_of_arr" immernoch 500 sein und nur die Adresse, die von add_of_arr 512 sein wird? Was ich aus dem Buch bekomme ist, dass sich die Adresse von add_of_arr ändert. Das verwirrt mich. Ich denke, es ist ein Fehler, aber ich bin mir nicht sicher.

Danke!

+0

geändert Warum sind Sie über die Adresse einer Pflege Adresse? Ja, das ist klar definiert, und ja, es gibt einige Fälle, in denen das sogar nützlich ist, aber Sie sind noch nicht da. Insbesondere scheinen Sie über 'int ** add_of_add_of_arr = & add_or_arr' zu sprechen, der 500 ist. – MSalters

+0

Ich war verwirrt, warum" & add_of_arr "sich änderte und nicht" add_of_arr ", aber es sieht wie ein Tippfehler aus. –

+0

Lesen Sie unsere Annahmen genau wie geschrieben, Sie haben Recht und das Buch ist falsch. Gut beobachtet! Vielleicht solltest du ein besseres, präziseres Buch bekommen. Nur so: ein 'int' ist nicht garantiert, 4 Bytes zu haben. Es kann eine beliebige Größe von 1 (!) Sein. Auch wenn die Adresse von 'addr' (bessere Namen verwenden!)' 500' ist, kann die Adresse von 'array' auch nicht' 500' sein, so dass der Wert nach dem Inkrementieren nicht '512' sein kann (angenommen: sizeof (int) == 4U')! – Olaf

Antwort

3

Es ist ein Tippfehler: Adresse in add_of_arr ist jetzt 512, aber die Adresse von add_of_addr hat sich nicht geändert.

0

Sie verwechseln zwei Dinge: Ein Zeiger ist eine Variable zum Speichern eines Speichers Adresse. Als Variable hat sie auch ihre eigene Adresse, wo sie sich im Speicher befindet. Wie Sie gesagt haben, lassen Sie diese add_of_arr=arr_of_int daher kopiert die Adresse des arr_of_int[0] in den Speicherplatz 500. Es sei nun angenommen, arr_of_int ist Speicherplatz 400. Dann add_of_arr=arr_of_int speichert 400 in den Speicherplatz 500. Nach add_of_arr += 3 Ihre Zeiger 500. Der Ausdruck sein an Speicherplatz 500 enthält 412. die Adresse von add_of_arr (erhalten durch &add_of_arr) aber immer noch 500, aber sein Wert (erhalten durch add_of_arr) von 400 auf 412.

+0

Sieht eher aus wie der Autor des Buches war verwirrt. OP ist richtig! – Olaf