Die ausgezeichnete Quelle ist die Verwirrung zu klären - dass Arrays und Zeiger sind nicht das gleiche ist, wie sie im Speicher adressiert werden.
Mit einem Array,
char new_str[];
, hat der Compiler der neuen_str eine Speicheradresse gegeben, die sowohl bei der Kompilierung als auch bei der Laufzeit bekannt ist, z. 0x1234, daher ist die Indizierung von new_str einfach, indem
[]
verwendet wird. Beispielsweise
new_str[4]
, zur Laufzeit wählt der Code die Adresse aus, in der sich
new_str
befindet, z. 0x1234 (das ist die Adresse im physischen Speicher).Durch Hinzufügen des Indexspezifizierers , 0x1234 + 0x4, kann der Wert dann abgerufen werden. Der Zeiger gibt mit einem Zeiger dem Symbol
char *newstr
eine Adresse an, z. B.
. 0x9876, aber zur Laufzeit ist diese Adresse ein indirektes Adressierungsschema. Unter der Annahme, dass Newstr malloc'd
newstr = malloc(10);
ist, passiert, dass jedes Mal eine Referenz im Code verwendet wird, um newstr zu verwenden, da die Adresse von newstr durch den Compiler bekannt ist, d. H. 0x9876, worauf aber newstr zeigt, ist variabel. Zur Laufzeit holt der Code Daten aus dem physischen Speicher 0x9876 (dh newstr), aber an dieser Adresse ist eine andere Speicheradresse (da wir sie mallocten), zB 0x8765 ist es hier, der Code holt die Daten von dieser Speicheradresse malloc zugewiesen zu newstr, dh 0x8765.
Die char new_str[]
und char *newstr
werden austauschbar verwendet, da ein nullte Element Index des Arrays in einen Zeiger zerfällt und das erklärt, warum Sie könnten newstr[5]
oder *(newstr + 5)
Beachten Sie, wie der Zeiger Ausdruck verwendet wird, obwohl wir char *newstr
erklärt haben, damit
*(new_str + 1)
= *newstr;
ODER
*(new_str + 1)
= newstr[1];
Zusammengefasst, der wahre Unterschied zwischen den beiden ist, wie sie im Speicher zugegriffen werden.
Holen Sie sich das Buch und lesen Sie es und leben Sie es und atmen Sie es. Es ist ein brillantes Buch! :)
Werfen Sie einen Blick auf diesen erstaunlichen Tutorial http://pw2.netcom.com/~tjensen/ptr/cpoint.htm – jyz