字符指针的地址值

时间:2011-03-07 16:31:04

标签: c++

//如果代码是

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之间的空格时它应该已经停止了。

4 个答案:

答案 0 :(得分:4)

输出流使用的operator<<重载已为const char*重载,因此您可以更自然地输出字符串文字和C字符串。

如果要打印地址,可以将指针强制转换为const void*

std::cout << static_cast<const void*>(sptr);

在第二个问题中,\0是空终止符:它用于终止字符串。 array实际上包含"hello world\0",因此循环在到达字符串末尾之前不会停止。 helloworld之间的字符是空格字符(大概):' '

答案 1 :(得分:1)

  1. 当您打印char*时,它会以字符串形式打印。

  2. '\0'不是' '

答案 2 :(得分:0)

关于你的第一个问题:

默认情况下,通过调用charstd::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本身,并且根据字节序,零字节将是第一个或第二个。

虽然技术上是未定义的行为。