2010-05-30 16 views

Antwort

2

Erste Deklaration deklariert ein Array, während zweite - ein Zeiger.

Wenn Sie in bestimmten Aspekt interessiert sind, bitte klären Sie Ihre Frage.

9

char a[]="string"; // a ist ein Array von Zeichen.

char *p="string"; // p ist ein String-Literal mit statischer Zuordnung. Jeder Versuch, den Inhalt von zu ändern, führt zu einem nicht definierten Verhalten, da Zeichenfolgenliterale im schreibgeschützten Speicherbereich gespeichert werden.

2

Kein Unterschied. Es sei denn, Sie möchten tatsächlich in das Array schreiben. In diesem Fall wird die gesamte Welt explodieren, wenn Sie versuchen, das zweite Formular zu verwenden. Siehe here.

27

Der erste ist Array, der andere ist Zeiger.

Die Array-Deklaration „char a[6];“ Anfragen, den Platz für sechs Zeichen aufzuheben, um unter dem Namen bekannt zu sein „a.“ Das heißt, gibt es einen Ort namens „a“, an dem sechs Zeichen sitzen können. Die Zeigerdeklaration "char *p;" hingegen fordert einen Platz an, der einen Zeiger enthält. Der Zeiger soll unter dem Namen "p," bekannt sein und kann überall auf ein beliebiges Zeichen (oder zusammenhängendes Zeichenfeld) zeigen.

Die Aussagen

char a[] = "hello"; 
char *p = "world"; 

in Datenstrukturen führen würde, die wie folgt dargestellt werden:

+---+---+---+---+---+---+ 
a: | h | e | l | l | o |\0 | 
    +---+---+---+---+---+---+ 
    +-----+  +---+---+---+---+---+---+ 
p: | *======> | w | o | r | l | d |\0 | 
    +-----+  +---+---+---+---+---+---+ 

Es ist wichtig, dass eine Referenz wie x zu realisieren [3] je anderen Code erzeugt auf ob x ein Array oder ein Zeiger ist. Wenn der Compiler den Ausdruck a [3] sieht, gibt er unter den obigen Deklarationen Code aus, um an der Position "a" zu beginnen, drei nach ihm zu verschieben und das Zeichen dorthin zu holen. Wenn er den Ausdruck p [3] sieht, gibt er Code aus, um an der Stelle "p" zu beginnen, holt den Zeigerwert dorthin, addiert drei zu dem Zeiger und holt schließlich das Zeichen, auf das gezeigt wird. Im obigen Beispiel ist sowohl a [3] als auch p [3] das Zeichen "l", aber der Compiler kommt dort anders an.

Sie können Suche verwenden es gibt Tonnen von Erklärungen zu dem Thema im Internet.

+4

wo ist der Speicher im ersten Fall und wo im zweiten Fall? Stapel? Haufen? Wenn Sie sich entscheiden, auf etwas anderes zu verweisen, bedeutet das, dass "wrold" freigegeben wird? – Laz

+6

+1 für ASCII-Artwork. –

+3

@Ram Bhat: Im ersten Fall hängt es davon ab, wo diese Definition liegt. wenn es in einer Funktion ist, wahrscheinlich auf dem Stapel, wenn es in einer Struktur ist, hängt es davon ab, wo die gesamte Struktur zugeordnet ist; wenn es außerhalb einer Funktion ist, im globalen vars-Segment. Das Gleiche gilt für den Zeiger p; Die Zeichenfolge "world", auf die p zeigt, ist * normalerweise * in einem bestimmten Abschnitt der ausführbaren Datei, der beim Laden in den Speicher zugeordnet wird, der als Zeichenfolgentabelle verwendet wird. –

1

Ein Unterschied besteht darin, dass sizeof (a) -1 zur Kompilierzeit durch die Länge der Zeichenfolge ersetzt wird. Mit p müssen Sie strlen (p) verwenden, um die Länge zur Laufzeit zu erhalten. Außerdem mögen einige Compiler char * p = "string" nicht, sie wollen const char * p = "string". In diesem Fall ist der Speicher für "string" schreibgeschützt, aber der Speicher für a nicht. Selbst wenn der Compiler die const-Deklaration nicht benötigt, ist es eine schlechte Übung, den String zu ändern, auf den p zeigt (zB * p = 'a'). Der Zeiger p kann so geändert werden, dass er auf etwas anderes zeigt. Mit dem Array a muss ein neuer Wert in das Array kopiert werden (wenn es passt).