为什么当 char *s = "123" 时 s[s[3]] = '1'?

问题描述

char* s = "123";
std::cout << s[s[3]] << std::endl; // prints 1
std::cout << s[3] << std::endl; // prints nothing?

我尝试运行以下代码段,第一个打印语句输出 1,而第二个输出(似乎)没有。在这里使用char指针数组的长度取消引用指针时发生了什么?

解决方法

不清楚为什么要使用 索引 3 处字符的值 (s[3]) 再次索引字符串。但无论如何,这里的关键是您使用 char 来索引数组。这意味着 char 用作数字,转换最有可能使用 ASCII 字符编码。

打印 s[3] 时什么也没有打印出来的原因是因为 s 是一个长度为 4 的字符数组,最后一个字符是空终止符。 Null 表示数字 0。空终止符标识字符串的结尾。但它不是一个可打印字符,因为它不是用来打印的。它没有与之关联的字形,因此您不会打印任何内容。

当然,您现在可以看到 s[s[3]] 只不过是 s[0],即字符“1”。