| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2469 人关注过本帖
标题:数组名称既然代表数组的内存地址,为什么在给数组用scanf赋值的时候加“&” ...
只看楼主 加入收藏
oszc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:154
注 册:2011-4-15
结帖率:100%
收藏
 问题点数:0 回复次数:11 
数组名称既然代表数组的内存地址,为什么在给数组用scanf赋值的时候加“&”
程序代码:
#include<stdio.h>

int main(void)
{
    int i=0;
    float monthlyTemperatures[12]={0};

    for (i=0;i<12;i++)
    {
        printf("Enter the integer: ");
        scanf("%f",&monthlyTemperatures[i]);
    }

    for (i=0;i<12;i++)
    {
        printf("%.2f\n",monthlyTemperatures[i]);
    }

    
        return 0;
}
    

P.S. 给字符串数组赋值时又不加,这两者似乎有矛盾。

[ 本帖最后由 oszc 于 2011-5-4 17:43 编辑 ]
搜索更多相关主题的帖子: 内存 color 
2011-05-04 17:34
那个人啊
Rank: 2
等 级:论坛游民
帖 子:56
专家分:36
注 册:2011-3-9
收藏
得分:0 
同求,我也搞不懂。
2011-05-04 17:43
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
有两种情况不需要地址运算符&:
1,用与数组相同类型指针指向数组的时候,比如:
int array[10],*ptr;
ptr=array;
2,在将数组作为形参传递给函数的时候,例如:
int array[10];
fun(array);

而scanf("%i",&array[i])则是必须要使用&的,
scanf把指向数组的指针作为它的参数。 否则,
会出现意料不到的错误。个人理解, 仅供参考。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-05-04 17:44
_xiong_mao_1
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:49
专家分:102
注 册:2010-12-6
收藏
得分:0 
&monthlyTemperatures[i],表示给该数组的第i个元素赋值,所以取的是第i个元素的地址咯,C里面不能给数组整体赋值,直接给数组名不行的。
2011-05-04 17:51
mlj518128
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-4
收藏
得分:0 
回复 楼主 oszc
   由于字符数组的整体标志是数组名monthlyTemperatures,它表示串的起始地址,所以在用scanf()输入字符数组monthlyTemperatures时,只需要写出monthlyTemperatures即可,不必再写取地址运算符&,当然,也可以将输入语句书写为:scanf("%s",&monthlyTemperatures[0];
2011-05-04 18:01
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
呵呵 其实在函数调用的时候

传递的数组也会退化为指针  fun(int a[])  和 fun(int *a)

但是返回值不能是数组  所以函数通常用传递一个数组的方式来实现返回数组

                                         
===========深入<----------------->浅出============
2011-05-04 18:05
oszc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:154
注 册:2011-4-15
收藏
得分:0 
十分感谢各位回答,尤其四楼五楼给我很大启示

现在的理解对于“数值型数组”代表物理内存的“初始”地址,编译器无法寻找到数组的“后续”地址
scanf("%f",&monthlyTemperatures[i]);
//修改成
scanf("%f",monthlyTemperatures);

编译通过,赋值总是在数组monthlyTemperatures[0]上。
原因也许没有办法区分每个数值,比如12345,可以代表一个整体,也可以代表分离的1、2、3、4、5,那干脆只要是数值类型编译器就认为是整体。

对于字符串型数组的话,可以非常简洁的认为每个字符代表数组的一个元素,在接收的时候按顺序即可排列成为一个字符串数组。

[ 本帖最后由 oszc 于 2011-5-4 19:08 编辑 ]
2011-05-04 19:05
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
写成scanf("%f", monthlyTemperatures + i);即可!
看了楼上的回答觉得大家对指针还是一知半解,现在我来解释一下:
[]它是变址运算符,其如 arr[1] = *(arr + 1)
&arr[1]就是&(*(arr + 1)) 就是arr第二个元素的地址,所以也可以写成arr + 1
怎样?

[ 本帖最后由 lz1091914999 于 2011-5-4 19:33 编辑 ]

My life is brilliant
2011-05-04 19:30
oszc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:111
专家分:154
注 册:2011-4-15
收藏
得分:0 
楼上对于数值完美的答案,但是对于字符型数组怎么解释呢?感谢

[ 本帖最后由 oszc 于 2011-5-4 23:47 编辑 ]
2011-05-04 20:46
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
受用
2011-05-04 22:17
快速回复:数组名称既然代表数组的内存地址,为什么在给数组用scanf赋值的时候加 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017934 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved