C++编程问题请大神赐教谢谢...

char animal[20] = "bear";
double bubble = 3.2;
char *ps;
double *p;

为什么可以直接ps=animal,并且cout<<ps就是ps指针指向的字符串而不是输出地址。
而double 类型却需要p = &bubble,并且 cout<<p 是地址,而不是double类数值?

数组名的值是个指针常量,也就是数组第一个元素的地址,所以animal的类型是char *,可以直接ps=animal。而double 类型是个变量,要赋值给double *的指针变量需要取double 类型变量的地址,所以double 类型需要p = &bubble。cout标准输出对char *是按字符串来解析,所以cout<<ps输出的是字符串,cout标准输出对其他指针类型默认是按地址输出,所以cout<<p输出的是地址

因为c++标准库的标准输出cout实现方式,如果遇到char*参数就输出字符串。
如果遇到double*,那么编译器就调用cout运算符的usigned int类型重载函数,等于把double*类型作为数值传入

char * 类型,字符串,也就是字符的指针。
double *类型,double类型的指针。

输出字符串需要字符串的地址(同样输出字符,需要传入字符的值比如你的*ps,就会输出第一个字符b)。
输出double类型的值就要传入*p,因为你的p类型是double指针

数组名的值是个指针常量,也就是数组第一个元素的地址,所以可以直接ps=animal。而double 类型是个变量,要赋值给double *的指针变量需要取double 类型变量的地址,所以double 类型需要p = &bubble。cout标准输出对char *是按字符串来解析,所以cout<<ps输出的是字符串,cout标准输出对其他指针类型默认是按地址输出,所以cout<<p输出的是地址
建议参考学习c++ primer plus。里边讲解十分详细。