关于指针的这些陈述是否具有相同的效果?

时间:2010-01-19 19:33:09

标签: c pointers

这是......

char* myString = "hello";

...和此有同样的效果吗?

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

4 个答案:

答案 0 :(得分:33)

没有

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

第一个示例在堆栈上创建一个大小为13*sizeof(char)的数组,并将字符串"Hello world!"复制到其中。
第二个示例在堆栈上创建char*并将其指向可执行文件的数据段中的一个位置,该位置包含字符串"Hello world!"。第二个字符串是 READ-ONLY

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

答案 1 :(得分:4)

没有。第一个为您提供指向const数据的指针,如果您通过该指针更改任何字符,则它是未定义的行为。第二个将字符复制到一个不是const的数组中,因此您可以随意更改任何字符(直接在数组中或通过指针),不会产生任何不良影响。

答案 2 :(得分:3)

没有。在第一个中,您无法修改myString指向的字符串,在第二个中可以修改。阅读更多here

答案 3 :(得分:3)

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

另一方面,这是 close 等同于:

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

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

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可能相等或不相等 - 两者都有效。