char数组和char指针的比较

时间:2019-04-23 18:37:05

标签: c arrays char

我在玩游戏时发现一个结果,我无法理解,这涉及到char数组和指针。

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

为什么charArray != charPtr1/2charPtr 1 == charPtr2

我虽然在创建charPtr1时会创建一个临时数组并指向该数组。如果是这样,为什么它们不一样?

3 个答案:

答案 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限定类型的复合文字,   不需要指定不同的对象