打印

关于scanf函数中的地址列表

[复制链接]
1572|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdmgb520|  楼主 | 2011-3-22 22:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
scanf函数的形式如下:scanf(格式控制,地址列表)

例如一个整型变量的输入:
int a;
scanf("%d",&a);
这是容易理解的,但是如果要输入一个字符串的时候呢?
    char a[50];

scanf(
"%s",&a);
scanf("%s",a);
以上两条语句到底哪个是正确的呢?
首先,根据C语言(谭浩强第3版)P230的说明,“数组名代表数组中首元素的地址”,且有两条语句等价的例子:p=&a[0] 等价于 p=a ,我认为第二条scanf语句是正确的,但实际是两条 scanf语句都是正确的。
哪位能解释下这是为什么。

相关帖子

沙发
gdmgb520|  楼主 | 2011-3-25 22:47 | 只看该作者
没人回复!

使用特权

评论回复
板凳
sysdriver| | 2011-3-25 23:12 | 只看该作者
你既然都说 p=&a[0] 等价于 p=a
那你干嘛不这样写呢?
scanf("%s",&a[0]);
scanf("%s",a);
是否发觉自己说话矛盾了?
还有,数组的输入值,书上有N种方法,为什么不看看书呢?

int  *p= a;
for(i=0;i<50;i++)
{
         scanf("%c",p++);
}

使用特权

评论回复
地板
gdmgb520|  楼主 | 2011-4-12 22:40 | 只看该作者
谢谢楼上的热心回复。
可能我没有说清楚,我并不是像输入一个数组,也并不只是想输入一个字符串。
char a[50];
&a
a
这里我是想搞明白a和&a的区别,虽然&a[0]和a等价,但是&a和a也等价吗?
还在学习中,谭浩强的C语言指针部分我还只看一遍,我想至少还应该看9遍。
再次谢谢楼上兄弟的热心回答。

使用特权

评论回复
5
new1988| | 2011-4-13 11:10 | 只看该作者
数组命只是个常量,你对它取址有意义吗?就像你对100这个常量去取址能取到什么?
所以&a本身就是错的。

使用特权

评论回复
6
gdmgb520|  楼主 | 2011-4-13 18:24 | 只看该作者
恩,数组名是一个指针常量,实际就是一个地址。对地址取地址应该是没有意义。
但是C编译器并没有报错,

回头我上下我在vs2008 C 和EW430 c watch 窗口中的截图。

使用特权

评论回复
7
无赖皮肤| | 2011-4-17 10:59 | 只看该作者
&a,a,&a[],三者作为左值的意思分别是:
a:数组a[]的首元素的首地址;
&a:数组a[]的首元素的地址;
&a[]:和a作为左值意思一样;
请分清楚他们的区别

使用特权

评论回复
8
无赖皮肤| | 2011-4-17 11:00 | 只看该作者
写错了,都是作为右值,不好意思

使用特权

评论回复
9
gdmgb520|  楼主 | 2011-4-18 22:49 | 只看该作者
7# 无赖皮肤



&a说得不对,作为右值,例如:
char a[10] = {0};
&a 表示一个指向一个有10个char类型数据组成的数组,&a+1,指针指向的地址会跳十个:
名称            值                                类型
  a               0x0012ff30 "烫……"     char [10]
  &a            0x0012ff30                  char [10]*
  &a+1        0x0012ff3a                  char [10]*

以上是在vs2008 C 环境中的结果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝