char a [] ="string"之间的区别; char*p ="string";

Blu*_*Sky 12 c

可能重复:
C中的char s []和char*s有什么区别?

char a[]="string";和之间有什么区别char *p="string";

Inc*_*ito 27

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

数组声明" char a[6];"请求留出六个字符的空格,以名称" a." 知道.也就是说,有一个名为" a" 的位置,其中可以包含六个字符.char *p;另一方面,指针声明" "请求保持指针的位置.指针将由名称" p," 知道,并且可以指向任何位置的任何char(或连续的chars数组).

声明

char a[] = "hello";
char *p = "world";
Run Code Online (Sandbox Code Playgroud)

会导致数据结构可以表示如下:

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+
   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

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

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

  • ASCII作品的+1. (6认同)
  • 在第一种情况下分配的内存在哪里,在第二种情况下分配在哪里?堆?堆?当你决定将p指向某个其他地方时,这是否意味着"wrold"将被解除分配? (4认同)
  • @Ram Bhat:在第一种情况下,它取决于定义的位置; 如果它在一个函数中,可能在堆栈中,如果它在一个结构中,它取决于整个结构的分配位置; 如果它在任何函数之外,则在全局变量段中.对于指针p也是如此; p指向的"world"字符串,*通常*位于可执行文件的特定部分,在加载时映射到内存中,用作字符串表. (3认同)

Pra*_*rav 9

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

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


Fyo*_*kin 2

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

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