字符数组和字符指针的比较

3

在玩耍的过程中,我发现了一个结果,涉及到字符数组和指针,让我无法理解。

char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

为什么charArray != charPtr1/2,但是charPtr1 == charPtr2
我认为在创建charPtr1时,它会创建一个临时数组并指向那里。如果是这样的话,为什么它们不同呢?

它将创建一个不同的临时数组。 - ForceBru
有一个单一的常量“Array”,charPtr1和charPtr2都引用它,但是charArray声明了自己的存储空间,所以*charArray指向不同的位置。你可以把它想象成:常量“Array”被复制到为charArray[]分配的存储空间中。我不知道在C标准中是否定义了共享常量字符串,或者是编译器特定的。如果你想让charPtr1和charPtr2指向与charArray相同的东西,那么将它们声明为:char * charPtr1 = charArray; - Alcamtar
3个回答

4
这可能会有所帮助:这里
一个反汇编的
char charArray1[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

使用GCC8.3显示

charArray1:
        .string "Array"
.LC0:
        .string "Array"
charPtr1:
        .quad   .LC0
charPtr2:
        .quad   .LC0

换句话说,这两个指针指向包含字符串“Array”的同一内存位置,而数组则保存了自己的字符串副本。
正如链接所示,由于涉及不同类型,char数组的内存被分开处理。关于指针,由于它们的任务是只指向某些数据,编译器可能会选择优化相同字面数据的重复分配。
指针的字面数据是只读的。

4
char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

why is charArray != charPtr1/2, but charPtr 1 == charPtr2?

charArray实际上是一个数组,它的内容可以被更改。格式为char charArray[6] = { 'A', 'r', 'r', 'a', 'y', 0 };charPtr1charPtr2都是指向char类型的指针,因此它们不可能等于charArray(除非在执行charPtr1 = charArray;等操作后)。
事实上,charPtr1charPtr2是编译器的优化。编译器检测到字符串“Array”被多次使用,将其定义一次,并使用其地址初始化这两个变量。

1
第一个char charArray[] = "Array";等同于char charArray[] = {'A', 'r', 'r', 'a', 'y', '\0'},这是对具有自动存储期的数组对象进行初始化。
情况2和3都指向同一数组对象的第一个元素,这意味着指针比较相等。标准规定:6.5.2.5(p7)

字符串字面值和带有const限定类型的复合字面值不需要指定不同的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接