一个困扰我好久的问题(求救啊)

kin988g 2011-10-01 05:49:38
#include <iostream>
using namespace std;

int main() {
int c[5]={1,2,3,4,5};
char b[5]={'1','2','3','4','5'};
cout<<c;
cout<<endl;
cout<<b;
return 0;
}


运行结果为:0x22ff20 //地址
12345@4 //乱码

想不通为什么cout<<b;不能输出地址?求救大家
...全文
131 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kin988g 2011-10-02
  • 打赏
  • 举报
回复
谢谢大家,我懂了
5t4rk 2011-10-02
  • 打赏
  • 举报
回复

由于cout是一个类对象,这个类重载了运算符<<,

当它的操作数是char*时,视作输出一个c风格的字符串,

直到遇到空字符,而非输出指针的值,想输出指针的值,

显式转换为非char指针就行了,例如:

cout << ( void* )b;

乱码是缺少结束字符 '\0'
ccnunlp 2011-10-02
  • 打赏
  • 举报
回复
输出一个字符串数组是默认到'\0'为止的,你应该加一个川尾,而输出地址的那个是,cout也可用于输出一个地址的,此处的int a[]中a这个数组名可以看作一个指针
AnYidan 2011-10-02
  • 打赏
  • 举报
回复
语言的东西,很多是硬性的规定,没有道理可言
ljhhh0123 2011-10-02
  • 打赏
  • 举报
回复
除了sizeof(c)表示的是整个数组的大小外,数组c代表的是数组元素的指针(指针值是常量)。
int c[5]; c就是int*const p;
char b[5]; b就是 char * const p;
那么cout遇到整型指针时则输出这个指针值,如果是字符指针时,则输出这个字符串。
楼主这样的写法容易产生歧义。
如果真要输出地址值的话,请明确的做出转型。加上地址操作符&即可。
如:&c,&b;
biegaoshuwoya 2011-10-01
  • 打赏
  • 举报
回复
要输出b 的地址可以转换下cout<<(int *)b;
xfuan 2011-10-01
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main() {
int c[5]={1,2,3,4,5};
char b[5]={'1','2','3','4','5'};
cout<<c;
cout<<endl;
cout<<b;
return 0;
}


c数组是整形,c只表示数组第一个元素的地址,b是字符数组,在c语言中,他有特别的地方就是:输出时从起始位置往后输出遇到‘\0’.#include <iostream>
using namespace std;

int main() {
int c[5]={1,2,3,4,5};
char b[6]={'1','2','3','4','5'};

for(int i=0;i<5;i++)
cout<<c[i];
cout<<endl;
cout<<b;
return 0;
}
chelp 2011-10-01
  • 打赏
  • 举报
回复
字符数组,要用cout 输出必须要以字符'\0'结尾
对于字符串,默认加’'0'
wolf_you 2011-10-01
  • 打赏
  • 举报
回复
这里你输出b实际上他是访问指针的数据,而且字符串一般以\0结束...你这个没有结束符所以貌似会有乱码....
你这样定义 char *b="12345"; 然后 cout<<b;就会是:12345 。楼主可以单步调试一下程序...
不过你可以用 printf("%X\n",b);
chelp 2011-10-01
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main() {
int c[5]={1,2,3,4,5};
char b[5]={'1','2','3','4','5'};
char s[5]={'2','3'};//剩下的的三个元素是'\0'
cout<<c<<endl;

cout<<b<<endl;//cout是以'\0'结束的,但其中没有顾出乱码
cout<<(int)(b)<<endl;//这才输出的是b的地址

cout<<s<<endl;
return 0;
}
hondely 2011-10-01
  • 打赏
  • 举报
回复
lz 数组是这样输出的吗?
for(int i=0; i<len; i++)
cout<<c[i];


c本来就是初始地址啊
chouxiaoya8100 2011-10-01
  • 打赏
  • 举报
回复
对于字符串,字符数组, cout 是这样操作的。。

它会找 字符数组的结尾'\0' , 你没有提供,所以就多出来了。。。。

你改成:{'1','2','3','4','5' ,'\0'} 试试




[Quote=引用楼主 kin988g 的回复:]
#include <iostream>
using namespace std;

int main() {
int c[5]={1,2,3,4,5};
char b[5]={'1','2','3','4','5'};
cout<<c;
cout<<endl;
cout<<b;
return 0;
}


运行结果为:0x22ff20 //地址
12345@4 ……
[/Quote]
taodm 2011-10-01
  • 打赏
  • 举报
回复
因为“规定”啊。否则,你现在就在问:哪咋输出字符串了。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧