¿Estas declaraciones sobre punteros tienen el mismo efecto?

Haz esto…

char* myString = "hello"; 

… ¿tiene el mismo efecto que esto?

 char actualString[] = "hello"; char* myString = actualString; 

No.

 char str1[] = "Hello world!"; //char-array on the stack; string can be changed char* str2 = "Hello world!"; //char-array in the data-segment; it's READ-ONLY 

El primer ejemplo crea una matriz de tamaño 13*sizeof(char) en la stack y copia la cadena "Hello world!" en ello.
El segundo ejemplo crea un char* en la stack y lo apunta a una ubicación en el segmento de datos del ejecutable, que contiene la cadena "Hello world!" . Esta segunda cadena es de LECTURA ÚNICA .

 str1[1] = 'u'; //Valid str2[1] = 'u'; //Invalid - MAY crash program! 

No. El primero te da un puntero para const data, y si cambias cualquier caracter por ese puntero, es un comportamiento indefinido. El segundo copia los caracteres en una matriz, que no es const , por lo que puede cambiar cualquier carácter (ya sea directamente en la matriz, o mediante el puntero) a voluntad sin efectos negativos.

No. En la primera, no puedes modificar la cadena apuntada por myString , en la segunda puedes myString . Lea más aquí .

No es lo mismo, porque la matriz sin nombre apuntada por myString en el primer ejemplo es de solo lectura y tiene una duración de almacenamiento estática, mientras que la matriz nombrada en el segundo ejemplo es grabable y tiene una duración de almacenamiento automática.

Por otro lado, esto está más cerca de ser equivalente:

 static const char actualString[] = "hello"; char* myString = (char *)actualString; 

Sin embargo, todavía no es lo mismo, porque las matrices sin nombre creadas por los literales de cadenas no se garantiza que sean únicas, mientras que las matrices explícitas sí lo son. Entonces en el siguiente ejemplo:

 static const char string_a[] = "hello"; static const char string_b[] = "hello"; const char *ptr_a = string_a; const char *ptr_b = string_b; const char *ptr_c = "hello"; const char *ptr_d = "hello"; 

ptr_a y ptr_b tienen la garantía de comparar desigual, mientras que ptr_c y ptr_d pueden ser iguales o desiguales, ambos son válidos.