关于c ++:双引号的属性

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"的指针。这是一个重要的区别,如果您将值ptr点更改为,将导致未定义的行为,因为您将更改它指向的常量值。

例子:

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();
}


对于字符串,在末尾添加了一个特殊的终端字符\0。这说明这就是字符串的结尾。

因此,如果您有一个字符串"hello",它将不断地读取每个字符:"h"、"e"、"l"、"l"、"o"、"0",这会告诉它停止。

字符数组类似,但没有终端字符。相反,数组本身的长度指示要读取的字符数(这不一定适用于所有方法)。