我在玩游戏时发现一个结果,我无法理解,这涉及到char数组和指针。
char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";
为什么charArray != charPtr1/2
是charPtr 1 == charPtr2
?
我虽然在创建charPtr1
时会创建一个临时数组并指向该数组。如果是这样,为什么它们不一样?
答案 0 :(得分:4)
public function download() { // File path $id = $this->uri->segment(3); $id1 = $this->uri->segment(4); $filepath1 = FCPATH.'upload/'.$id; $filepath2 = FCPATH.'upload/'.$id1; $filename = "backup.zip"; $this->zip->download($filename); }
为什么是charArray!= charPtr1 / 2,但是charPtr 1 == charPtr2?
charArray 实际上是char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";
,因此它是一个数组,其包含内容可以更改
charPtr1 和 charPtr2 都是指向char charArray[6] = { 'A', 'r', 'r', 'a', 'y', 0 };
的指针,因此它们都不能等于char
({{1}之后的除外)等等)
charPtr1 和 charPtr2 是对编译器的优化,可以检测文字字符串“ Array”被多次使用,一次定义并使用其初始化两个变量的地址
答案 1 :(得分:4)
This可能会有帮助。
反汇编
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数组的内存是分开的。关于指针,由于它们的工作只是指向某些数据,因此编译器可能会选择针对同一文字数据优化出重复的分配。
指针的文字数据是只读的。
答案 2 :(得分:1)
第一个char charArray[] = "Array";
等效于char charArray[] = {'A', 'r', 'r', 'a', 'y', '\0'}
,它是具有自动存储持续时间的数组对象的初始化。
情况2、3都指向同一数组对象的第一个元素,这意味着指针比较相等。该标准指定6.5.2.5(p7)
:
字符串文字和具有const限定类型的复合文字, 不需要指定不同的对象