2010-05-30 21 views

risposta

2

Prima dichiarazione dichiara un array, mentre il secondo - un puntatore.

Se sei interessato alla differenza in qualche aspetto particolare, ti preghiamo di chiarire la tua domanda.

9

char a[]="string"; // a è una matrice di caratteri.

char *p="string"; // p è un letterale stringa con allocazione statica. Qualsiasi tentativo di modificare il contenuto di p porta al comportamento non definito poiché i valori letterali di stringa sono memorizzati nella sezione di memoria di sola lettura.

2

Nessuna differenza. A meno che non si voglia scrivere effettivamente nell'array, nel qual caso il mondo intero esploderà se si tenta di utilizzare il secondo modulo. Vedi here.

27

Il primo è l'array, l'altro è il puntatore.

La dichiarazione di matrice "char a[6];" richieste che lo spazio per sei caratteri sia annullata, per essere conosciuto con il nome di "a." Cioè, c'è una posizione denominata "a" in cui sei caratteri possono sedersi. La dichiarazione puntatore "char *p;", d'altra parte, richiede un posto che contiene un puntatore. Il puntatore deve essere conosciuto con il nome "p," e può puntare a qualsiasi char (o matrice contigua di caratteri) ovunque.

Il bilancio

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

comporterebbe strutture di dati che possono essere rappresentati in questo modo:

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

È importante rendersi conto che un riferimento come x [3] genera codice diverso a seconda se x è un array o un puntatore. Date le dichiarazioni di cui sopra, quando il compilatore vede l'espressione a [3], emette il codice per iniziare nella posizione "a", spostarlo di tre volte e recuperare il personaggio lì. Quando vede l'espressione p [3], emette il codice per iniziare nella posizione "p", recupera il valore del puntatore lì, ne aggiunge tre al puntatore e infine recupera il carattere puntato a. Nell'esempio sopra, sia a [3] che a p [3] capita di essere il carattere 'l', ma il compilatore arriva in modo diverso.

È possibile utilizzare la ricerca ci sono un sacco di spiegazioni in materia in internet.

+4

dove si trova la memoria allocata nel primo caso e dove nel secondo caso? pila? mucchio? quando decidi di indicare p a qualcun altro ciò significa che "wrold" sarà deallocato? – Laz

+6

+1 per grafica ASCII. –

+3

@Ram Bhat: nel primo caso, dipende da dove viene collocata quella definizione; se è in una funzione, probabilmente in pila, se si trova in una struttura, dipende da dove è allocata l'intera struttura; se è al di fuori di qualsiasi funzione, nel segmento vars globale. Lo stesso vale per il puntatore p; la stringa "world" a cui p fa riferimento, invece, * solitamente * si trova in una particolare sezione dell'eseguibile che viene mappata in memoria al momento del caricamento, che viene usata come tabella delle stringhe. –

1

Una differenza è che sizeof (a) -1 verrà sostituita con la lunghezza della stringa in fase di compilazione. Con p è necessario utilizzare strlen (p) per ottenere la lunghezza in fase di esecuzione. Anche alcuni compilatori non amano char * p = "string", vogliono const char * p = "string", nel qual caso la memoria di "string" è di sola lettura ma la memoria di a non lo è. Anche se il compilatore non richiede la dichiarazione const, è una cattiva pratica modificare la stringa puntata da p (cioè * p = 'a'). Il puntatore p può essere modificato in modo da puntare a qualcos'altro. Con l'array a, un nuovo valore deve essere copiato nell'array (se adatto).