今天我已经了解了指针,我有这个:
char message[]="hello everyone";
char *pm;
pm=message;
cout<<&pm[0];
这会输出hello everyone
,我想知道为什么?因为&amp;应该输出pm [0]的地址而不是孔值。有人可以解释一下吗?
答案 0 :(得分:4)
&pm[0]
的类型为char*
。 <<
重载了char const*
以打印所有字符,直到'\0'
。如果您要打印地址,则必须先将其转换为void*
。
答案 1 :(得分:2)
message
是包含char
的{{1}}数组。
执行hello everyone\0
时,数组pm = message;
会进行数组到指针的转换,从而为指针指向数组中的第一个元素。因此,message
现在指向数组中的第一个pm
(char
字符)。
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";
之类的操作,而不仅仅是获取内存地址。