//如果代码是
char str[]="hello";
char *sptr=&str[2];
cout<<sptr;
//输出不是十六进制值,而是llo
....为什么?
//还要考虑以下代码
char array[]="hello world";
char array1[11];
int i=0;
while(array[i]!='\0')
{array1[i]=array[i];
i++;}
//如果我们打印array1,它会被打印为hello world,但是当遇到hello和world之间的空格时它应该已经停止了。
答案 0 :(得分:4)
输出流使用的operator<<
重载已为const char*
重载,因此您可以更自然地输出字符串文字和C字符串。
如果要打印地址,可以将指针强制转换为const void*
:
std::cout << static_cast<const void*>(sptr);
在第二个问题中,\0
是空终止符:它用于终止字符串。 array
实际上包含"hello world\0"
,因此循环在到达字符串末尾之前不会停止。 hello
和world
之间的字符是空格字符(大概):' '
。
答案 1 :(得分:1)
当您打印char*
时,它会以字符串形式打印。
'\0'
不是' '
答案 2 :(得分:0)
关于你的第一个问题:
默认情况下,通过调用char
将std::cout
解释为文字表示。
如果要输出字符的十六进制表示形式,请使用以下代码:
std::cout << std::hex << static_cast<int>(c);
c
是你的角色。
在您的代码中:
cout<<sptr;
sptr是char
的指针,而不是char
,因此std::cout
将其显示为C字符串。
关于你的第二个问题:
空格是ASCII字符32,而不是0.因此,您的测试只检查其副本的结束空字符。
答案 3 :(得分:0)
关于cout,有一个特殊的重载,用于将const char *(和char *)写入将打印内容而不是指针的流。
关于array1,实际上将它设置为11是没有错的,因为你没有将空字节复制到它中。问题出在你尝试打印时,因为它会尝试打印,直到找到0字节,这意味着读取数组的末尾。
目前,编译器可能会填充几个字节,因为接下来的事情是一个int,因此可能会对齐它。实际上,填充的一个字节可以是任何东西,但不一定是零字符。
它可能遇到的下几个字符将是int本身,并且根据字节序,零字节将是第一个或第二个。
虽然技术上是未定义的行为。