这些关于指针的陈述有相同的效果吗?

做这个…

char* myString = "hello"; 

…有同样的效果吗?

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

没有。

 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 

第一个示例在堆栈上创build一个大小为13*sizeof(char)的数组,并复制string"Hello world!" 进去。
第二个示例在堆栈上创build一个char* ,并将其指向可执行文件的数据段中的一个位置,该位置包含string"Hello world!" 。 这第二个string是只读的

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

第一个是给你一个指向const数据的指针,如果你通过这个指针改变任何字符,它就是未定义的行为。 第二个将字符复制到一个不是const的数组中,所以你可以随意改变任何字符(或者直接在数组中,或者通过指针),而不会产生任何不良影响。

没有。在第一个,你不能修改myString指向的string,在第二个你可以。 在这里阅读更多。

它不一样,因为myString在第一个例子中指向的unnamed数组是只读的并且具有静态存储持续时间,而第二个示例中的named数组是可写的并具有自动存储持续时间。

另一方面,这更接近于等同:

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

它仍然不完全相同,因为由string文字创build的未命名的数组不能保证是唯一的,而显式数组是。 所以在下面的例子中:

 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_aptr_b比较不等,而ptr_cptr_d可以相等或不等 – 两者都是有效的。