C语言中字符串不理解的地方,关于指针

为什么第一个输出的和第二个不一样呢,还有第三个和第四个,最好每隔都解释一下吧,我看见别人的好像理解了,但是我这为什么不行,别人的解释如下:

首先char *d="hello"定义的d是一个字符指针,d的内存单元里存的是hello这个字符串常量在计算机内存中的地址,字符指针变量d在内存单元中本身也有一个地址。
再来看第一条语句printf("%d\n",d)它输出的是d的值,即d的 内存单元里所存的东西(字符串常量hello的地址);第二条语句printf(“%d\n”,&d);它输出的是d的地址,所以第一条语句和第二条语句输出结果不一样。
接下来看printf("%s\n",*d);这条语句,%s后面跟的参数表列是字符串常量或字符数组的指针(地址),而*d是取d所指向内存单元里的内容,它不是一个指针,所以计算机在运行时会报错。
最后看printf("%s",d)据上面所述,因为d里存的是字符串常量hello的地址,相当于(&"hello"),所以正确。追问

*d 的内容不就是个字符串吗

追答

没错,*d的内容是个字符串,但是%s后面的参数表列要求是指针。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-17
楼上的是正解。可能你对指针的概念不太理解,指针其实就是内存的地址。打个比喻:内存就好比一个摩天大厦,每个内存字节就是大厦里面的一个一个的房间,每个房间的房间号就是该内存的地址,当你写下char *d="Hello"; 时,计算机为你做了2件事,第一,帮你在该大厦预定了6个房间,用来放字符串"Hello",存放字符串中第一个字符“H”的房间号(即字符串的首地址,假设是506)就被存到了变量d里面了(所以变量d也称位指针变量,专门放地址的变量);第二,系统把这个房间的名字“d”(呵呵,这个名字是你定义变量起的)放在了其它房间(假设606).所以printf ("%d\n",d);的含义是按十进制输出d里的东西,即输出的是“Hello”的首地址:506 。而printf ("%d\n",&d); 输出的是存放房间名“d”的地址,说以输出的是606 。而printf ("%s\n",*d); ,本身是语法错误,c语言中规定printf ("%s\n",地址);你写的*d是指的d房间所放的东西,不合语法规定,如果这样写倒是可以的 printf ("%d\n",*d);或printf ("%c\n",*d);你能想出来这2个写法输出什么吗?(呵呵,你如果能预知输出结果说明你对指针理解的差不多了)。printf ("%s\n",d); 这个写法是c语言输出字符串的合法使用,正如楼上所说“完全正确”。追问

那跟char s[]有什么区别呢,&s 不就是S的地址吗(第一个字节存放的位置),&S难道是指“S”名字的地址?那 为什么int e=56,,&e就是就是56的这个数字的地址呢

追答

&是取地址运算符!&s是s名的地址,数组名s是存放数组中第一个字符地址的常量!

第2个回答  2013-10-17
这个不难理解啊,初始化程序后,为d这个指针也是变量申请一个内存来存放,这个内存只是放一个指针地址,而不是hello
式指向存放hello这个内存块的一个指针
所以打印d时,时一个地址,就是d这个变量的内存存放的数据(指向hello内存块的首地址)
&d是打印d这个变量的地址

后面字符串%s打印
*d时hello这个字符串的首地址h的地址这个数据,而不是字符串
d时hello的首地址,当然就是打印hello了追问

追答

变量名字只是一个让人识别的代号,在转变为exe的汇编代码后,这个d是没有意义的,不存在的
ffb1是给d申请的内存空间,存放d的数据,也就是一个指针,地址

打印*d时,只是打印一个地址,%s时是没有意义的
d时,打印%s,那么就打印这个地址指向的字符串的首地址,从而打印那个hello字符串

如果你定义一个char数组,让d指向这个数组,那样更好理解一些

追问

不知道这样对不对,但是我发现char b[]的&b ,每次都在变化,不是说这个数据地址不会变的吗

追答

一个程序,他一般都会有一个数据段.data,程序段.code
一般来说,是程序段中的程序代码对数据段中的数据进行操作

每个变量都会在数据段有内存空间进行存储这个变量的数据
也就是常说的变量的内存模型
现在讨论的就是关于这个方面的问题,还牵扯到寻址问题
变量名在data段是没有意义的,他只是为了让人好记,标记的内存地址而已
如char b[],在变成exe后,只会是一个ffc1地址而已

指针,他的内存空间中存放的数据是一个内存地址
如你图中的样子,ffb1中存放的是ffc1这个数据,访问ffb1时,就是访问ffc1这个数据

在%s打印中,*d就是访问ffc1这个数据,而不是ffc1这个地址
加*,是访问这个数据,
不加*,是当地址使用

本回答被提问者采纳
第3个回答  2013-10-17
char *d="Hello"; // d 字符串指针变量 *d 表示 指向的 内容 d 是地址
printf ("%d\n",d); // 把字符地址用十进制数显示
printf ("%d\n",&d); // 把指针的地址用十进制数显示
printf ("%s\n",*d); // printf 要求是提供字符串的地址,而不是内容当然出错。
printf ("%s\n",d); // d 刚好就是字符串的地址,完全正确。追问

*d 里的内容不就是那个字符串吗

相似回答