这输出的为什么不是地址 ? ? ? ??

zhulinjia 2009-02-18 11:35:09
 int main()
{
char a = 'a';
char *p= &a;
*(p+1) = '\0';
cout << p;//这输出的为什么不是地址

system("pause");
return 0;
}

讲解时: 最好从浅到深。

在这 谢谢大家了
...全文
353 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
chxy85 2009-02-19
  • 打赏
  • 举报
回复
int a = 10;
int *p = &a;
cout<<p<<endl;
这样才是地址,整形指针和字符指针输出有区别
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 arong1234 的回复:]
这是因为对于字符串指针char *, const char*以及任何和字符串有关的东西,系统都会特殊处理,只输出字符串内容而不会输出它的地址。如果输出它的地址,那么你将没法输出一个字符串是不是?要知道*p只代表一个字符,你唯一表示字符串的方法就是用p自己,这样,为了输出字符串,你只能用它的地址p去输出。你的输出函数在这种情况下不能输出地址,否则所有系统都无法工作了
[/Quote]

所以你要输出地址,用print看看就可以了。
我看你有戏 2009-02-19
  • 打赏
  • 举报
回复


cout有约定的吧

如果传入的是char 指针
那么他就会输出到'\0'为止的字符串

可以把cout<<看成一个函数
我看你有戏 2009-02-19
  • 打赏
  • 举报
回复

#include "iostream"
using namespace std;
int main()
{
char a = 'a';
char *p= &a;
//*(p+1) = '\0';
//cout << p;//这输出的为什么不是地址

printf("0x%x",p);

system("pause");
return 0;
}
//用printf就可以啊
//这个是cout的问题吧
mycheche 2009-02-19
  • 打赏
  • 举报
回复
楼上的都是大哥
erhan_106 2009-02-19
  • 打赏
  • 举报
回复
其实次问题的关键就是 *(p+1) = '\0';
上面的语句使得char a = 'a';变换为string a="a";
而对于字符串的输出cout使用了运算符的重载 如6六楼所言
cout输出字符串的首地址时实际上是不是输出该地址
而是从该地址到'\0'结束之间所储存的内容
ydlchina 2009-02-19
  • 打赏
  • 举报
回复
字符类型与其他类型使用是有差别的
brookmill 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jia_xiaoxin 的回复:]
如果想输出指针指向的地址,可以用cout << (void *)p;
[/Quote]
这个不错,学习了
baihacker 2009-02-19
  • 打赏
  • 举报
回复
C++有哪些类型?
基本类型:bool,int那一大堆.
组合类型:数组,函数,指针,引用,类,联合,枚举,指向成员.

最穷的类型:
void
没有一个对象

最受剥削的类型:
引用:自己没有任何操作,默默地把操作转换到被引用的对象

最让人恨,最让人喜欢的类型:
指针:不知道多少英雄好汉在此折腰.

最无奈的:
类模板,默默地生成类型.

类型的保姆:
const volatile

被歧视的:
function 不是 object.

有时被忽略的:
const volatile
有时作为签名的一部分,有时又不是.
sxbwelcome 2009-02-19
  • 打赏
  • 举报
回复
支持4楼的说法
yangch_nhcmo 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 baihacker 的回复:]
cout < < a;
就是
cout.operator < < (a)
根据不同的a的类型,有重载.
当类型是char*, const char*的时候就输出以这个字符指针指向的字符开始的字符串直到一个结束标志'\0'为止.


字符和字符串:
字符的序列就是字符串.

字符串有结束标志吗?
作为一个串,知道其中元素的个数就行了.
你实现字符串这个概念的时候,不一定有标志.
但是我们常以'\0'表示结束.

char是什么?
char是在对应的语言中用来表示字…
[/Quote]

UP~
opengl3d 2009-02-19
  • 打赏
  • 举报
回复
呵呵,真是卧虎藏龙呀
ForestDB 2009-02-19
  • 打赏
  • 举报
回复
简单地说就是<<重载了const char *,本来是要打指针的,但是由于重载,打字串。
Shuni 2009-02-19
  • 打赏
  • 举报
回复

int main()
{
char a = 'a';
char *p= &a; //将a的地址赋给p
*(p+1) = '\0';
cout << p;//这输出的为什么不是地址(这里p是char *类型的)

system("pause");
return 0;
}
下面的例子你能看更清楚

#include<iostream>
using namespace std;
int main()
{
char a = 'a';
char *p= &a;
*(p+1) = 'b';
*(p+2) = '\0';
cout << p;//这输出的为什么不是地址

system("pause");
return 0;
}

这时的输出是ab
baihacker 2009-02-19
  • 打赏
  • 举报
回复
对了.是稍弱类型系统,稍强类型系统

char arr[8][8];
char * p = arr;
C:

warning: initialization from incompatible pointer type

C++:

error: cannot convert `char (*)[8]' to `char*' in initialization

在带初始化的声明中,arr首先将类型转换为指向第一个元素的指针.
C,C++都做到了.

但是,在这个初始化中,左边的类型是char*, 右边的是 char (*)[8];

C++禁止掉了,类型系统不允许.
C给出了警告,虽然认为不恰当的,但是允许这样做,给你更多的灵活性,让你自己把握.

其语义规则就是,让p的值,等于arr的第一个元素的地址(可以认为是第一个元素是个数组,也可以认为是最最里面的基本元素),不谈类型,谈值.

为了防止更多概念的引入,没有用左值或者右值
jia_xiaoxin 2009-02-19
  • 打赏
  • 举报
回复
cout在输出字符串指针时,其实输出的就是指针指向的内容,这是有operator<<(char *)函数内部实现的
如果想输出指针指向的地址,可以用cout << (void *)p;
baihacker 2009-02-19
  • 打赏
  • 举报
回复
字符串和数组?

数组是一类具有连续存储的相同类型元素的复合类型(其它语言不一定)
再和字符的序列:字符串相比较
具有某种共同点.

于是可以用数组来存储一个字符串,当然,最好多存一个'\0',表示结束,否则有时会很麻烦.

数组和指针?
C++中关于转换的第二三条说明了:
数组到指针
函数到指针
的转换.
数组的地址和数组的第一个元素的地址是相同的.
由于原生的数组类型(和容器区别),希望对整个数组定义操作是烦琐的.
你不能用一个原生的数组去加一个原生的数组,不能直接对一个数组进行赋值.

于是在适当的时候放在那里的一个标识符,如果类型是数组的话,会转为指向第一个元素的指针(注意,这里把值规则和类型规则都说明了)
值规则:指针的值和第一个元素的地址值相同
类型规则:指向数组的第一个元素的指针

这都是编译器默默地做的.

更恼火的就是l-value to r-value...不讲了了.

"我曾经以为可以规定[]是数组唯一的操作,实际上没有必要" 忘了为什么了...

...本来还想说什么...结果也忘了
operatingtuzi 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 baihacker 的回复:]
cout < < a;
就是
cout.operator < < (a)
根据不同的a的类型,有重载.
当类型是char*, const char*的时候就输出以这个字符指针指向的字符开始的字符串直到一个结束标志'\0'为止.


[/Quote]
up up
kevinnick 2009-02-19
  • 打赏
  • 举报
回复
具体的一些原理我也说不清楚,下面是做得一个实验:

vs2005:

char ch = 'z';
char *pc = &ch;

cout << &pc; //指针pc的地址
cout << *pc; //指针pc指向的地址中保存的值:z
cout << pc; //这里输出的是乱码
cout << &ch; //这里输出的也是乱码

cout << (void *)pc; //这里得到ch的地址
cout << (void *)&ch; //这里得到ch的地址


----------------------------------------------------------------
----------------------------------------------------------------

int ival = 1000;
int *pi = &ival;

cout << π //指针pi本身的地址
cout << pi; //pi指向的地址,即ival的地址
cout << *pi; //指针pi指向的地址中保存的值:1000


-----------------------------------------------------------------
-----------------------------------------------------------------

char st[100] = "you are the best!";
char *pst = st;

cout << &pst; //指针pst本身的地址
cout << pst; //输出:you are the best!
cout << &st; //得到 st的地址
cout << *pst; //输出:y

cout << (void *)pst; //得到 st的地址
cout << (void *)&st; //得到 st的地址





jakqigle 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 baihacker 的回复:]
C++有哪些类型?
基本类型:bool,int那一大堆.
组合类型:数组,函数,指针,引用,类,联合,枚举,指向成员.

最穷的类型:
void
没有一个对象

最受剥削的类型:
引用:自己没有任何操作,默默地把操作转换到被引用的对象

最让人恨,最让人喜欢的类型:
指针:不知道多少英雄好汉在此折腰.

最无奈的:
类模板,默默地生成类型.

类型的保姆:
const volatile

被歧视的:
function 不是 object.

有时被忽…
[/Quote]
有意思的...^_^
加载更多回复(14)

64,678

社区成员

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

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