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

Do these statements about pointers have the same effect?

这个……

1
char* myString ="hello";

…和这个效果一样?

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


不。

1
2
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!"。第二个字符串是只读的。

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


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


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

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

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

不过,情况仍然不完全相同,因为由字符串文本创建的未命名数组不一定是唯一的,而显式数组则是唯一的。所以在下面的例子中:

1
2
3
4
5
6
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可以相等或不相等,两者都有效。


不,第一个不能修改myString指向的字符串,第二个可以修改。在这里阅读更多。