可能重复:
What is the difference between char s[] and char *s in C?
char a[]="string";
和char *p="string";
之间有什么区别?
答案 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,必须将新值复制到数组中(如果适合)。