【问题标题】:Difference between char a[]="string"; char *p="string"; [duplicate]char a[]="string"; 之间的区别字符 *p="字符串"; [复制]
【发布时间】:2011-02-25 16:52:52
【问题描述】:

可能的重复:
What is the difference between char s[] and char *s in C?

char a[]="string";char *p="string"; 有什么区别?

【问题讨论】:

标签: c


【解决方案1】:

第一个是数组,另一个是指针。

数组声明“char a[6];”要求为六个字符留出空间,以名称“a.”为人所知,即有一个名为“a”的位置,其中六个字符可以坐。另一方面,指针声明“char *p;”请求一个存放指针的位置。该指针的名称为“p,”,可以指向任何地方的任何字符(或连续的字符数组)。

声明

char a[] = "hello";
char *p = "world";

会产生可以这样表示的数据结构:

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+
   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+

重要的是要意识到像 x[3] 这样的引用会根据 x 是数组还是指针生成不同的代码。鉴于上面的声明,当编译器看到表达式 a[3] 时,它会发出代码以从位置“a”开始,将其移过三个,然后从那里获取字符。当它看到表达式 p[3] 时,它会发出从位置“p”开始的代码,从那里获取指针值,将 3 加到指针上,最后获取指向的字符。在上面的示例中,a[3] 和 p[3] 都恰好是字符 'l',但编译器以不同的方式到达那里。

您可以使用搜索,互联网上有大量关于该主题的解释。

【讨论】:

  • 第一种情况下分配的内存在哪里,第二种情况下分配在哪里?堆?堆?当您决定将 p 指向其他东西时,这是否意味着“wrold”将被释放?
  • @Ram Bhat:在第一种情况下,这取决于该定义的放置位置;如果它在一个函数中,可能在堆栈上,如果它在一个结构中,它取决于整个结构的分配位置;如果它在任何函数之外,则在全局 vars 段中。指针 p 也是如此; p 指向的“世界”字符串,通常位于可执行文件的特定部分中,该部分在加载时映射到内存中,用作字符串表。
【解决方案2】:

char a[]="string"; //a 是一个字符数组。

char *p="string";// p 是一个静态分配的字符串字面量。任何修改 p 内容的尝试都会导致未定义行为,因为字符串文字存储在内存的只读部分中。

【讨论】:

    【解决方案3】:

    第一个声明声明了一个数组,而第二个声明是一个指针。

    如果您对某些特定方面的差异感兴趣,请澄清您的问题。

    【讨论】:

      【解决方案4】:

      没有区别。除非您想实际写入数组,否则如果您尝试使用第二种形式,整个世界都会爆炸。见here

      【讨论】:

        【解决方案5】:

        一个区别是 sizeof(a)-1 将在编译时替换为字符串的长度。使用 p 您需要使用 strlen(p) 在运行时获取长度。还有一些编译器不喜欢 char *p="string",他们想要 const char *p="string" 在这种情况下,"string" 的内存是只读的,但 a 的内存不是。即使编译器不需要 const 声明,修改 p 指向的字符串也是不好的做法(即 *p='a')。指针 p 可以更改为指向其他东西。对于数组 a,必须将新值复制到数组中(如果合适的话)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-16
          • 2021-04-10
          • 2018-11-12
          • 1970-01-01
          • 1970-01-01
          • 2014-07-26
          • 2017-01-29
          • 2020-08-17
          相关资源
          最近更新 更多