Possibili duplicati:
What is the difference between char s[] and char *s in C?Differenza tra char a [] = "stringa"; char * p = "stringa";
Qual è la differenza tra char a[]="string";
e char *p="string";
?
Possibili duplicati:
What is the difference between char s[] and char *s in C?Differenza tra char a [] = "stringa"; char * p = "stringa";
Qual è la differenza tra char a[]="string";
e char *p="string";
?
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.
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.
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.
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.
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
+1 per grafica ASCII. –
@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. –
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).
Potrebbe rendere questa domanda più breve? – liori
Questo è un duplicato –
@liori: char a [] = "s"; ! = char * p = "s"; ? :) – PeterM