关于指针的小疑点

关于指针的小问题
偶是新手,代码如下:
#include<iostream>
using namespace std;
int main(){
  char* cp="Hello";
  cout<<cp<<endl;
}
结果输出是"Hello",这是事实。可我就迷糊了,变量cp必竟是指针啊,输出时应该是个32位整数指针值啊,怎么成了"Hello"字符串了?钱能著《C++程序设计教程》(第二版)指针一节中说:“给指针赋值,不但必须是一个地址,而且应该是一个与指针类型相符的变量或常量的地址”,而这里赋值却是"Hello",这是哪跟哪啊?头疼,快请指教。

------解决方案--------------------
"Hello"是一个字符串,实际上这个字符串只是定义在数据段的一段数据而已,而真正用于赋值的是字符串的首地址,也就是字符'H'的地址,这样赋值给char*变量就好理解了
相应的对char*数据打印也是一样,cout定义的针对char*类型的处理就是处理其指向的字串,如果要打印指针的值,可以将其转换成int型
------解决方案--------------------
我想,理解成“<<”被重载成打印字符串,而不是地址比较容易
------解决方案--------------------
"hello”这种常量字符串存在一块固定的静态存储区内,因为它是c风格字符串,而C风格字符串都是以“\0”做结尾,因此很多地方都只使用其首地址就够了,没有必要进行很多的拷贝,传递其首地址,然后很多函数(如cout)都是找到“\0”就认为字符串结束,这就足够了。
------解决方案--------------------
inline ostream& ostream::operator<<(const unsigned char * _s) { return operator<<((const char *) _s); }
inline ostream& ostream::operator<<(const signed char * _s) { return operator<<((const char *) _s); }

看看重载<<的定义就知道了。

------解决方案--------------------
cout对int*和char*处理不一样。这样说清楚了吗?
------解决方案--------------------
1 char* cp="Hello";
准确的写法应该是这样的:
const char* cp="Hello";
其中"Hello"是一个常量字符串(也是字符数组),在静态存储区里存储,然后将其地址赋值给局部变量cp;

2 cout < <cp < <endl; 
参考5楼和11楼的解释;