可能有重复问题:
在 C 语言中 char s[] 和 char *s 有什么区别?
char a[]="string";
和 char *p="string";
有什么区别?
可能有重复问题:
在 C 语言中 char s[] 和 char *s 有什么区别?
char a[]="string";
和 char *p="string";
有什么区别?
char a[6];
" 请求分配六个字符的空间,并以名称"a
"命名。也就是说,在某个位置有一个名为 "a
" 的位置,可以容纳六个字符。另一方面,指针声明 "char *p;
" 请求分配一个保存指针的位置。该指针将被命名为 "p
",并且可以指向任何 char(或连续的 char 数组)的位置。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"开始获取指针值,将三个添加到指针,最后获取指向的字符的代码。在上面的例子中,a[3]和p[3]都恰好是字符'l',但编译器的实现方式略有不同。char a[]="string";
//a
是一个字符数组。
char *p="string";
// p
是一个静态分配的字符串字面量。任何试图修改p
内容的尝试都会导致未定义行为,因为字符串字面量存储在只读内存段中。
第一个声明声明了一个数组,而第二个声明声明了一个指针。
如果您对某个特定方面的差异感兴趣,请明确您的问题。
一个区别是,sizeof(a)-1将在编译时被替换为字符串的长度。对于p,需要使用strlen(p)在运行时获取长度。此外,一些编译器不喜欢char *p="string",他们希望const char *p="string",在这种情况下,“string”的内存是只读的,但a的内存不是。即使编译器不要求const声明,修改指向p的字符串(即*p='a')也是不好的实践。指针p可以更改为指向其他内容。对于数组a,必须将新值复制到数组中(如果它适合的话)。