char * 指针问题搞不明白,请给洗洗脑

yoyoxo 2004-10-11 10:56:36
菜鸟问题,不要见笑。
搞不明白下面的输出为什么是这样的,
#include <iostream.h>
void main(void)
{
//这里面的buf,buf[n],&buf,&buf[n]到底代表的啥玩意????
char * buf="This is a test";
cout<<buf<<"\n";
cout<<buf[0]<<"\n";
cout<<buf[1]<<"\n";
cout<<&buf<<"\n";
cout<<&buf[0]<<"\n";
cout<<&buf[1]<<"\n";
return;
}

输出结果:
This is a test
T
h
0x0012FF7C
This is a test
his is a test

BTW:哪本书对诸如此类的问题讲得比较深入?
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
grooving 2004-10-11
  • 打赏
  • 举报
回复
cout<<&buf[0]
因为&buf[0]这个地址是个char型的,所以自动输出所有的。
如果buf指向的是int型的。那将输出0xF2等内存地址表示。
kenyle 2004-10-11
  • 打赏
  • 举报
回复
看来楼主跟我是一样的才学习C++
我把学习的跟你来一起分享:
如你题中所说你要搞清楚如下:
1、*、&。
2、数组的表示形式。
char * buf //表示一个字符的指针。
但是char * buf="......."; //这个是表示这个字符指针是指向一个字符数组的。
从上面推出下面的结果,根据数组的知识我们可以知道,
[&buf代表字符数组的首地址],
而* buf是什么呢?
这样说这个数组首地址是一个值对吧,那么指针*buf就是指身这个地址的。
而buf[0]...buf[1]...等代表什么呢?我用你的例子就可以说明了,你看一下。
buf[0]是C/C++的默认写法,表代一个数组的首元素,与VB和DELPHI等有点不同,
如你题buf[0]的就是的=号后面""里面的T字母。推出buf[1]=h,buf[2]=i .........依次垒加 但是要注意最后一个字母不是t,而是\0,这个是数组的特性。代表数组结束符。不过数组也可以越界呀什么的这里我们就不细说了。要知所有的知识你可以先看一下清华的教材,钱能主编的《C++程序设计教程》一书,但这个也不是最好的。最好的买一本第三版的《c++primer》有中文的我前天看了130多块,没有钱就没有买。
cowboy313 2004-10-11
  • 打赏
  • 举报
回复
buf, &buf与&buf[n]表示地址, 其中buf,&buf[n]表示字符串中的地址,而输出字符串中的地址是输出整个字符串(到"/0"结束),&buf表示的是buf指针所存放的内存地址.
故你输出buf,&buf[0],&buf[1],就是输出了字符串, 而输出&buf却输出了地址.
buf[n]表示字符串中第n个元素, 输出时就是单个字符.
evice 2004-10-11
  • 打赏
  • 举报
回复
记住输出字符串指针就是输出字符串。
buf[0]是一个字符变量,而取地址之后就是与buf指向同一地址的指针。
李马 2004-10-11
  • 打赏
  • 举报
回复
如你所说,这里buf前同样有取址运算符,为什么一个输出地址,一个却输入第一个字符??
======================
其实buf和&buf和&buf[0]都是一样的,这一点你用C中printf的%X格式输出就可以看出。cout默认重载针对char *的行为就是输出由这个指针指向的整个字符串,而对于用&取的地址则输出地址本身。
这样一来buf和&buf[0]都是char *,所以会输出字符串,&buf则会输出地址。
kobefly 2004-10-11
  • 打赏
  • 举报
回复
,&buf[0]输出buf指向的东东的第一个位置的元素的地址,怎么输出:
This is a test
cout<<buf;
yoyoxo 2004-10-11
  • 打赏
  • 举报
回复
请教:
to titilima(李马):
cout<<&buf<<"\n"; // 输出字符串的地址
cout<<&buf[0]<<"\n"; // 从第1个字符开始输出字符串,等同于第1句
----
如你所说,这里buf前同样有取址运算符,为什么一个输出地址,一个却输入第一个字符??

to grooving(东游西逛)
cout<<&buf //输出指针所在的地址,而不是指针指向的地址
cout<<&buf[0] //输出buf指向的东东的第一个位置的元素的地址
----
如你所说,&buf[0]输出buf指向的东东的第一个位置的元素的地址,怎么输出:
This is a test


谢谢!
evice 2004-10-11
  • 打赏
  • 举报
回复
数组名其实就是指向数组起始地址的指针。你有指向字符串起始地址的指针,自然可以反过来当数组用。
grooving 2004-10-11
  • 打赏
  • 举报
回复
内存中存在一个指针buf和一个字符串常量
buf指向字符串数组

cout<<buf //输出buf指向的东东
cout<<buf[0] //输出buf指向的东东的第一个位置的元素
...
cout<<&buf //输出指针所在的地址,而不是指针指向的地址
cout<<&buf[0] //输出buf指向的东东的第一个位置的元素的地址
...

李马 2004-10-11
  • 打赏
  • 举报
回复
cout<<buf<<"\n"; // 输出整个字符串(字符数组)
cout<<buf[0]<<"\n"; // 输出数组的第一个成员,也就是字符'T'
cout<<buf[1]<<"\n"; // 同理,输出字符'h'
cout<<&buf<<"\n"; // 输出字符串的地址
cout<<&buf[0]<<"\n"; // 从第1个字符开始输出字符串,等同于第1句
cout<<&buf[1]<<"\n"; // 从第2个字符开始输出字符串
evice 2004-10-11
  • 打赏
  • 举报
回复
清华的C++教材上有的。
buf是个指向字符串的指针,这种指针也可以当数组用,反之也成立。比如:char buf[512];这样声明,buf仍然是指针。buf[0]当然就是第一个字符了。依次类推。

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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