Differenza tra char * e char

So che questa è una domanda molto semplice. Sono confuso sul perché e come sono diversi i seguenti.

char str[] = "Test"; char *str = "Test"; 

 char str[] = "Test"; 

È una matrice di chars , inizializzata con i contenuti di “Test”, mentre

 char *str = "Test"; 

è un puntatore alla stringa letterale (const) “Test”.

La principale differenza tra loro è che il primo è un array e l’altro è un puntatore. L’array possiede il suo contenuto, che capita di essere una copia di "Test" , mentre il puntatore si riferisce semplicemente al contenuto della stringa (che in questo caso è immutabile).

Un puntatore può essere puntato su qualcos’altro:

 char foo[] = "foo"; char bar[] = "bar"; char *str = foo; // str points to 'f' str = bar; // Now str points to 'b' ++str; // Now str points to 'a' 

L’ultimo esempio di incremento del puntatore mostra che si può facilmente iterare sul contenuto di una stringa, un elemento alla volta.

Il primo

 char str[] = "Test"; 

è un array di cinque caratteri, inizializzato con il valore "Test" più il terminatore null '\0' .

Il secondo

 char *str = "Test"; 

è un puntatore alla posizione di memoria della stringa letterale "Test" .

Uno è puntatore e uno è matrice. Sono diversi tipi di dati.

 int main () { char str1[] = "Test"; char *str2 = "Test"; cout << "sizeof array " << sizeof(str1) << endl; cout << "sizeof pointer " << sizeof(str2) << endl; } 

produzione

 sizeof array 5 sizeof pointer 4 

La differenza è la memoria STACK utilizzata.

Ad esempio, quando si programma la programmazione per microcontrollori in cui è allocata pochissima memoria per lo stack, fa una grande differenza.

 char a[] = "string"; // the compiler puts {'s','t','r','i','n','g', 0} onto STACK char *a = "string"; // the compiler puts just the pointer onto STACK // and {'s','t','r','i','n','g',0} in static memory area. 

"Test" è un array di cinque caratteri (4 lettere, più il terminatore null.

char str1[] = "Test"; crea quell’array di 5 caratteri e lo nomina str1 . Puoi modificare il contenuto di quell’array quanto vuoi, ad es. str1[0] = 'B';

char *str2 = "Test"; crea quell’array di 5 caratteri, non lo nomina e crea anche un puntatore denominato str2 . Imposta lo str2 per puntare a quell’array di 5 caratteri. Puoi seguire il puntatore per modificare l’array quanto vuoi, ad es. str2[0] = 'B'; o *str2 = 'B'; . È anche ansible riassegnare quel puntatore per puntare altrove, ad es. str2 = "other"; .

Un array è il testo tra virgolette. Il puntatore punta semplicemente su di esso. Puoi fare molte cose simili con ciascuna, ma sono diverse:

 char str_arr[] = "Test"; char *strp = "Test"; // modify str_arr[0] = 'B'; // ok, str_arr is now "Best" strp[0] = 'W'; // ok, strp now points at "West" *strp = 'L'; // ok, strp now points at "Lest" // point to another string char another[] = "another string"; str_arr = another; // compilation error. you cannot reassign an array strp = another; // ok, strp now points at "another string" // size std::cout << sizeof(str_arr) << '\n'; // prints 5, because str_arr is five bytes std::cout << sizeof(strp) << '\n'; // prints 4, because strp is a pointer 

per l'ultima parte, nota che sizeof (strp) sta per variare in base all'architettura. Su una macchina a 32 bit, sarà 4 byte, su una macchina a 64 bit sarà 8 byte.