有人可以解释这个大学练习

时间:2014-12-04 11:06:56

标签: c++ pointers

今天我已经了解了指针,我有这个:

char message[]="hello everyone";
char *pm;
pm=message;
cout<<&pm[0];

这会输出hello everyone,我想知道为什么?因为&amp;应该输出pm [0]的地址而不是孔值。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:4)

&pm[0]的类型为char*<<重载了char const*以打印所有字符,直到'\0'。如果您要打印地址,则必须先将其转换为void*

答案 1 :(得分:2)

message是包含char的{​​{1}}数组。

执行hello everyone\0时,数组pm = message;会进行数组到指针的转换,从而为指针指向数组中的第一个元素。因此,message现在指向数组中的第一个pmchar字符)。

h相当于pm[0],它基本上只是为您提供数组中的第一个字符。然后*(pm + 0)获取该字符的地址,为您指定第一个字符。因此&pm[0]pm完全相同。

&pm[0]有一个特殊的重载来处理cout。当您将char*传递给char*时,它假定您希望它像C样式字符串一样打印出来,其中cout指向数组中的第一个字符以char*结尾的字符。

答案 2 :(得分:1)

&pm[0]&(*(pm+0))相同,与&(*pm)相同,与pm相同。并且pm指向零终止字符数组message的第一个元素。

现在,输出流的<<运算符在传递char*const char*时将其视为指向以null结尾的字符数组的指针。也就是说,一个C字符串。

因此,字符串的全部内容都输出到输出流。

  

&应输出pm[0]

的地址

不,&运算符与输出无关。 &运算符是表达式&pm[0]的一部分。如上所述,评估该表达式。并且该评估的结果将传递给输出流的<<运算符的最佳匹配重载。 <<运算符确定如何输出表达式的值,并且该确定基于表达式的类型。

为了输出地址,您需要提供不同类型的参数,例如void*。您可以像这样强制转换char*指针:

static_cast<const void*>(&pm[0])

答案 3 :(得分:-1)

通常,给std::cout指针将导致指针的值(它包含的内存地址)被打印。

但是,[const] char*有一个特殊情况,它自动被假定为C风格的字符串,因此被解除引用以被视为一个。这(与数组名称衰减一致)是允许您执行std::cout << "Hello world\n";之类的操作,而不仅仅是获取内存地址。