【发布时间】:2021-07-10 16:58:31
【问题描述】:
char* s = "123";
std::cout << s[s[3]] << std::endl; // prints 1
std::cout << s[3] << std::endl; // prints nothing?
我尝试运行以下 sn-p 并且第一个打印语句输出 1 而第二个输出(似乎)没有。此处使用 char 指针数组的长度解引用指针时会发生什么?
【问题讨论】:
-
s[3]为零。s[0]是“1”。 -
零不是'0'。
-
"123"实际上是一个 4 字符数组,因为它以空值结尾。所以s[3]就是'\0',可以转换成整数0所以s[s[3]]就是s[0]就是'1'。 -
更准确地说,像
"123"这样的文字字符串是一个四元素常量字符数组。这意味着您应该使用const char* s来指向此类字符串。你的编译器真的应该警告你这一点。 -
另外,请尝试打印
static_cast<int>(s[3])。它应该打印整数值0(不同于字符'0')。但是,不要尝试使用索引4及以后的任何内容,因为这超出了范围并会导致未定义的行为。
标签: c++ pointers char c-strings