Diferencia entre char * y char

Sé que esta es una pregunta muy básica. Estoy confundido en cuanto a por qué y cómo son los siguientes diferentes.

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

 char str[] = "Test"; 

Es una matriz de chars , inicializada con los contenidos de “Prueba”, mientras

 char *str = "Test"; 

es un puntero a la cadena literal (const) “Test”.

La principal diferencia entre ellos es que el primero es una matriz y el otro es un puntero. La matriz posee sus contenidos, que resultan ser una copia de "Test" , mientras que el puntero simplemente se refiere a los contenidos de la cadena (que en este caso es inmutable).

Un puntero puede ser reenfocado a otra cosa:

 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' 

El último ejemplo de incremento del puntero muestra que puede iterar fácilmente sobre los contenidos de una cadena, un elemento a la vez.

El primero

 char str[] = "Test"; 

es una matriz de cinco caracteres, inicializada con el valor "Test" más el terminador nulo '\0' .

El segundo

 char *str = "Test"; 

es un puntero a la ubicación de la memoria de la cadena literal "Test" .

Uno es un puntero y el otro es una matriz. Son diferentes tipos de datos.

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

salida

 sizeof array 5 sizeof pointer 4 

La diferencia es la memoria STACK utilizada.

Por ejemplo, cuando se progtwig para microcontroladores donde se asigna muy poca memoria para la stack, hace una gran diferencia.

 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" es una matriz de cinco caracteres (4 letras, más el terminador nulo).

char str1[] = "Test"; crea esa matriz de 5 caracteres y la llama str1 . Puede modificar el contenido de esa matriz tanto como desee, por ejemplo, str1[0] = 'B';

char *str2 = "Test"; crea esa matriz de 5 caracteres, no la nombra, y también crea un puntero llamado str2 . Establece str2 para apuntar a esa matriz de 5 caracteres. Puede seguir el puntero para modificar la matriz tanto como desee, por ejemplo, str2[0] = 'B'; o *str2 = 'B'; . Incluso puede reasignar ese puntero para señalar otro lugar, por ejemplo, str2 = "other"; .

Una matriz es el texto entre comillas. El puntero simplemente lo señala. Puedes hacer muchas cosas similares con cada uno, pero son diferentes:

 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; // comstacktion 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 

para la última parte, tenga en cuenta que sizeof (strp) va a variar en función de la architecture. En una máquina de 32 bits, será de 4 bytes, en una máquina de 64 bits será de 8 bytes.