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

时间:2010-05-30 13:57:30

标签: c

  

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

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

5 个答案:

答案 0 :(得分:27)

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

数组声明“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]和p [3]碰巧都是字符“l”,但编译器以不同的方式得到它们。

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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