遗憾的是,从 C 编程语言的起源来看,char *(即指向字符的指针)并不仅仅被视为指向像 int *(指向 int 的指针)或 float *(指向 float 的指针)这样的类型的指针,而是许多库函数将它们视为以 NUL 字符结尾的字符串。“字符串”是指文本。
因此,有许多库函数将 char* 视为特殊情况并将它们视为“以 nul 结尾的字符串”,这意味着它将将该指针视为(即多个连续)字符的数组,直到它到达 NUL 字符(即数值 0,而不是数字字节值为 48 或 0x30 的字符“0”)。
所以,如果在你的代码中你有
char *sz = "123";
这将分配 4 个字符,您看到的 3 个字符加上 NUL 字符
Addr:0x00050014 0x31 // ASCII char '1'
Addr:0x00050015 0x32 // ASCII char '2'
Addr:0x00050016 0x33 // ASCII char '3'
Addr:0x00050017 0x00 // ASCII char nul
sz (指向字符的指针,表示地址)将具有值 0x00050014 (请注意,起始地址值由您的计算机通过多个步骤通过编译器确定,然后是链接器,然后是加载器,然后可能是程序本身) .
当您执行
cout << sz << endl;
此操作时,程序会将指向字符的指针解释为指向以 nul 结尾的字符缓冲区的指针,并将字符串 123 转储到输出流 cout。它查看地址 0x00050014 处的值并查看其是否为 NUL(即 0),如果不是,则转储该字符,然后查看下一个地址。如果 0x00050015 不是 NUL,它会将 IT 转储出去。然后 0x00050016 处的值,看到它不是 NUL,将其转储,然后它到达 0x00050017 并看到它是 NUL,并且不会将其转储,并停止查看地址并在您执行的位置之后返回您的代码sz 的输出,特别是在这段代码中,它将返回到将 endl(行尾)转储到 cout 的点;
您最终将学习到比旧的 C 风格 char* 机制更好的文本表示方法,但现在,您只需要了解存在的遗留行为即可。