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

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

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

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

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

声明

 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’,但编译器以不同的方式到达那里。

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

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

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

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

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

没有不同。 除非您想要实际写入数组,否则如果您尝试使用第二种forms,整个世界将会爆炸。 看到这里 。

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