【问题标题】:Comparison of char array and char pointerchar数组和char指针的比较
【发布时间】:2019-09-13 00:11:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • "它将创建一个 [不同] 临时数组"
  • charPtr1 和 charPtr2 都引用了一个常量“Array”,但 charArray 声明它是自己的存储,因此 *charArray 指向不同的位置。您可以将其视为:将常量“Array”复制到为 charArray[] 分配的存储空间中。我不知道共享常量字符串是在 C 标准中定义的还是特定于编译器的。如果你想让 charPtr1 和 charPtr2 指向与 charArray 相同的东西,那么将它们声明为:char * charPtr1 = charArray;

标签: c arrays char


【解决方案1】:

第一个char charArray[] = "Array";等价于char charArray[] = {'A', 'r', 'r', 'a', 'y', '\0'},是数组对象的初始化,具有自动存储时长。

案例 2、3 都指向同一个数组对象的第一个元素,这意味着指针比较相等。标准规定6.5.2.5(p7)

字符串字面量和具有 const 限定类型的复合字面量, 不需要指定不同的对象

【讨论】:

    【解决方案2】:
    char charArray[] = "Array";
    char* charPtr1 = "Array";
    char* charPtr2 = "Array";
    

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

    charArray其实就是char charArray[6] = { 'A', 'r', 'r', 'a', 'y', 0 };,所以它是一个数组,包含可以改变

    charPtr1charPtr2 是指向 char 的指针,因此它们都不能等于 charArray(当然,charPtr1 = charArray; 等之后除外)

    charPtr1charPtr2 是编译器的一种优化,检测到文字字符串“Array”被多次使用,定义一次并使用它的初始化两个变量的地址

    【讨论】:

      【解决方案3】:

      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 数组的内存是这样分开的。关于指针,因为它们的工作只是指向一些数据,所以编译器可能会选择优化相同文字数据的重复分配。

      指针的文字数据是只读的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多