Properties of double quotes
我想知道双引号有什么属性,特别是在初始化char指针方面。
1 2 3 | char *ptr="hello"; char array[6]={'h','e','l','l','o'}; cout<<ptr<<endl<<array<<endl; |
上面的代码打印两次hello。我知道使用双引号表示一个字符串,或者一个末尾为空字符的字符数组。由于ptr正在寻找一个要分配给的内存地址(char*),我猜想"hello"会解析为"h"的内存地址,尽管您也在为数组的其余部分填充char值?如果是这样的话,这是否意味着在上面的代码中
1 | char *ptr="hello"; |
双引号在内存的某个地方创建了一个字符串,然后ptr被分配给该字符串的第一个元素,而
1 | char array[6]={'h','e','l','l','o'}; |
在内存某处创建一个数组,然后根据赋值运算符的右侧为每个索引赋值?
这里有两件重要的事情需要注意。
1 | char array[6]={'h','e','l','l','o'}; |
这将在堆栈上分配6个字节,并将它们初始化为"hello ";以下是等量的:
1 2 | char array[] ="hello"; char array[6] ="hello"; |
但是,下面是不同的。
1 | char *ptr="hello"; |
这将在堆栈上分配一个指向常量字符串"hello "的指针。这是一个重要的区别,如果您将值
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> void testLocal() { char s[] ="local"; // locally allocated 6 bytes initialized to"local\0" s[0] = 'L'; printf("%s ", s); } void testPointer() { char *s ="pointer"; // locally allocated pointer, pointing to a constant // This segfaults on my system, but really the behavior is undefined. s[0] = 'P'; printf("%s ", s); } int main(int argc, char * argv[]) { testLocal(); testPointer(); } |
对于字符串,在末尾添加了一个特殊的终端字符
因此,如果您有一个字符串"hello",它将不断地读取每个字符:"h"、"e"、"l"、"l"、"o"、"0",这会告诉它停止。
字符数组类似,但没有终端字符。相反,数组本身的长度指示要读取的字符数(这不一定适用于所有方法)。