C++中cout将字符型指针当做字符串名处理???

我才入门C++。。书上有段程序:#include<iostream>usingnamespacestd;intmain(){char**p;char*name[]={"B... 我才入门C++。。书上有段程序:
#include <iostream>
using namespace std;
int main(){
char **p;
char *name[]={"BASIC","FORTRAN","C++"};
p=name+2;
cout<<*p;
cout<<**p;
return 0;
}
表示对cout的输出很不理解啊,*p这个应该是一个地址啊,就是name数组的第三个元素,但是为什么cout中没有输出地址,而是把它指向的字符串输出了??
展开
 我来答
匿名用户
2012-08-30
展开全部
cout为流对象,自动识别输出数据的类型,对于字符地址,即指针类型,就是输出其所在地址区间的所有字符,直到字符串结束符'\0'为止。
数组name的元素存放的是字符串的首地址,name[0]的值为"BASIC"的首地址,name[1]的值为"FORTRAN"的首地址,name[2]的值为"C++"的首地址。
因为数组nam是存放地址的数组,即指针数组,所以二级指针的性质与name相当了。
p=name+2; //使p指向name[2],*p就是name[2]的值,即"C++"的首地址,所以cout<<*p输出"C++"
cout<<**p; //*p是"C++"的首地址,**p就是元素'C'的值,所以cout<<**p输出的是C
Bk0X
2012-08-30 · TA获得超过9413个赞
知道小有建树答主
回答量:1217
采纳率:60%
帮助的人:656万
展开全部
对于char* 或者wchar_t* , 都是会输出字符串.

如果想输出地址的话要转换下.

cout << (void*)*p; 这样.
追问
不好意思,能再问一下吗,为什么这样的话会输出字符串呢?
追答
看你说才刚入门, 就能问这样的问题, 应该是有C或者其他编程经验吧.
C++的IO流是通过操作符"重载"来实现的, 其通过参数类型的匹配来完成输出格式的匹配.

也就是说cout实际上定义了很多个<<, 使用是通过参数类型来决定调用哪一个.

比如说
OS& operator <<(OS&, char*) // 输出字符串的函数.
OS& operator <<(OS&, void*) // 输出指针地址的函数.

当cout << p时; 如果p是个char*, 那么就会调用前一个函数, 用字符串方式输出.
如果p是其他的指针, 包括void*,int*等等; 都会匹配第二个函数, 用指针方式输出.

cout不光定义了所有内置类型的 << 输出操作. 还有一些库类型也被包含在里面.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Mirro187
2012-08-30 · 超过17用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:87万
展开全部
**(p+1)//是打印是+号
*p是c++字符串的地址
**p是对c++这个字符串取第一个字符的意思
请问 你学过字符串吗?输出字符串不就是输出首地址之后申请的内存吗?
//char* p = "abc";
难道 你输出字符串abc 是cout<<*p<<endl;???不都是cout<<p<<endl;吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3038d88
2012-08-30 · TA获得超过1097个赞
知道小有建树答主
回答量:1670
采纳率:0%
帮助的人:1153万
展开全部
*p 就是字符串
p是地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式