这些关于指针的陈述有相同的效果吗?
做这个…
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_a
和ptr_b
比较不等,而ptr_c
和ptr_d
可以相等或不等 – 两者都是有效的。