C专家编程中关于数组的一个问题

guanbenben 2008-01-23 08:59:10
如下代码:

#include <stdio.h>

char a[]="abcdefg";
int main()
{
printf("%s\n",a);
printf("%s\n",&a);
printf("%s\n",&(a[0]));
return 0;
}


为什么在VC6中输出都是abcdefg?

而在C专家编程数组一章P217中输出不是这样的。

哪位给我解释一下?
...全文
412 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
悠悠长风 2008-01-24
  • 打赏
  • 举报
回复
当然15楼的补充很重要,((&a)+ 1 )和(a + 1)就完全不一样了。 因为&a和a的指针类型并不一样,但地址相同。
悠悠长风 2008-01-24
  • 打赏
  • 举报
回复
为什么a和&a的输出是一样的?
————————————————因为它们都是a数组的首地址。
qww_5 2008-01-24
  • 打赏
  • 举报
回复
应该是一样的
不过有要注意的地方:a和&(a[0])是一个东西,但&a和a就有点不一样了,首先它们都是指向"abcdefg"的首地址,但是((&a)+ 1 )和(a + 1)就完全不一样了。
char a[] = "abcdef";
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", &a[0]);
printf("%d\n", a + 1);
printf("%d\n", &a + 1);
printf("%d\n", &a[0] + 1);
结果:
1245048
1245048
1245048
1245049
1245055
1245049
harbor2008 2008-01-24
  • 打赏
  • 举报
回复
士大夫
v风雪山神庙v 2008-01-24
  • 打赏
  • 举报
回复
#include <stdio.h>

char a[]="abcdefg";
int main()
{
printf("%s\n",a);
printf("%s\n",&a);
printf("%s\n",&(a[0]));
printf("%d\n",&a); //再试试这个,你就明白了
printf("%d\n",a);
printf("%d\n",&(a[0]));
return 0;
}

问题在于%s,它取prinft函数的第二个参数作为字符串地址,这个字符串一直到'\0'结束。
尽信书不如无书。
mxling 2008-01-24
  • 打赏
  • 举报
回复
个人感觉没有错误,都是指向数组a的首地址,又都是要求输出字符串,输出字符串是应该是找数组最后的‘/0’,假如那几个情况要是输出不一样的话,对%s怎么找/0就没办法解释了
BtInside 2008-01-24
  • 打赏
  • 举报
回复
你的结果是对呀
C专家编程有这么明显的错误么??
汗 只是看了头两页...
GSD_WinKey 2008-01-24
  • 打赏
  • 举报
回复
都以字符串形式输出的结果.
rocky258 2008-01-24
  • 打赏
  • 举报
回复
"main.c", line 8: warning #2181-D: argument is incompatible with corresponding
format string conversion
printf("%s\n",&a);
wwwhaichun 2008-01-24
  • 打赏
  • 举报
回复
从华储论坛转一个帖子过来。

http://www.huachu.com.cn/bbs/dispbbs.asp?boardID=1&ID=3647

《C专家编程》勘误表
说明:(1)本勘误由译者收集和维护。本勘误中行号计数方法:标题行和代码行都包含在内。
(2)本勘误内容已经在本书第2次印刷中全部订正。
(3)感谢网友slmengcn和wangjunhothot的意见。

位置 误 正
前言
p1 倒数第3行 if( i = 3 if( i = 3 )
p1 倒数第1行 if( i == 3 if( i == 3 )
p2 第17行 长整数程序 lint程序
第1章
p7 倒数第5行 这种C语言 这种C语言变型
p9 第1行 缩进也作了相应修改, indent也作了相应修改,
p9 第15行 缩进 indent程序
p9 第16行 缩进 indent程序
p11 第8行 1994 1990
p12 倒数第9行 计算参数的顺序 参数求值的顺序
p14 第6行 biggest ing biggest int
p20 第11行 const char * const char **
p20 倒数第4行 但它们所指向的对象是不相容的, 但它们所指向的对象是不同的,
p24 第4行 #idefine #define
p25 第7行 “无类型保留” “无符号保留”
第2章
p29 2.2节下第2行 缺省全局范围 缺省全局作用域
p36 第18行 范围过宽 作用域过宽
p37 第3行 范围规则 作用域规则
p51 第13行 初如化 初始化
p52 第3行 跟踪程序被确定为操作平滑(平均)的速度。 按照原先的设计,这个跟踪程序应该对平滑(平均)速度进行操作。
第4章
p82 倒数第4行 int] int
第5章
p99 第14-15行 函数库所包含的某个函数的原型可能与其他头文件中所声明的函数的原型一样。 一个函数库包含许多函数的定义,但这些函数的原型声明却散布于多个头文件中。
p102 图5.3中 缺省全局域 缺省全局作用域
p103 第3行 缺省全局域 缺省全局作用域
第6章
p119 倒数第9行 SS段不保存在目标头文件中 BSS段不保存在目标头文件中
p133 第15行 把这个偏移量作为目标在Bug中进行进行跟踪。 使用这个偏移量来寻找这个Bug。

第7章
p148 倒数第9行 实际分配的内存块 你请求分配的内存块
p163 倒数第2行 工件 Thing
第8章
p182 第10行 c = getchar(); c = getch();
p188 倒数第7行 可以发现对sqort()的调用 可以发现对qsort()的调用
p189 倒数第9行 [“\021%siz\012\0”], [“\021%six\012\0”],
p195 第11行 char crlf[] = ( 0xd, 0xa, 0 ); char crlf[] = { 0xd, 0xa, 0 };
p196 解决方案 代码不完整 正确的代码请参考本勘误附件code.doc
第11章
第11章 p268 第6行 一个内层范围的结构名 一个内层作用域的结构名

wwwhaichun 2008-01-24
  • 打赏
  • 举报
回复
给一个内存地址,以字符串格式化打印其中的内容
怎么想也不应该是打印出来一个整数类型的地址值吧?

不知道 C专家编程 勘误表中是否有提到这个问题,
尽信书不如无书啊,楼主好学生,呵呵。。。
sheenl 2008-01-24
  • 打赏
  • 举报
回复
说明那本书写错了。
guanbenben 2008-01-24
  • 打赏
  • 举报
回复
&a是什么类型呢?
HHZZBB 2008-01-23
  • 打赏
  • 举报
回复
最好解释下
printf("%s\n",a);
printf("%s\n",&a);
这两句有什么却别
guanbenben 2008-01-23
  • 打赏
  • 举报
回复
楼上的 输出没有什么不一样。

另:为什么a和&a的输出是一样的?
悠悠长风 2008-01-23
  • 打赏
  • 举报
回复
应该就是输出abcdefg
shaoze5 2008-01-23
  • 打赏
  • 举报
回复


printf("[color=#FF0000]/%s[color]\n",&(a[0]));//你看看红色部分,可能不一样的哦!





two_55_eight 2008-01-23
  • 打赏
  • 举报
回复
数组名a代表数组的首地址,&(a[0])确实是代表a[0]的地址,但是和数组名a指向同一地址,所以1和3的printf的结果都应该是abcdefg,至于第二个打印结果,本人还不是很清楚,还有待学习。
guanbenben 2008-01-23
  • 打赏
  • 举报
回复
没人解答一下吗
guanbenben 2008-01-23
  • 打赏
  • 举报
回复
在C专家编程中,&(a[0])输出的是a[0]的地址

为什么a和&a的输出是一样的?不是取地址了吗
加载更多回复(6)

69,371

社区成员

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

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