为什么在以下代码中不需要“&”号?

时间:2019-12-10 14:47:47

标签: c pointers scanf

我了解在C编程中,除了字符串以外,所有变量ty(int,float,char,..)都将' scanf '与''一起使用。这是我的程序代码。在“ scanf ”前面,为什么不需要“ ”?我可以进一步了解scanf吗?

#include <stdio.h>
#define M 10

int main()
{
    int i, n, sum = 0;
    int a[M];

    do{
        printf("Input a positive number less than %d \n",M);
        scanf("%d", &n);
    }while (!(n >0 && n < M));

    printf("Input %d numbers \n",n);

    for(i=0; i<n ; i++){
        scanf("%d",(a+i));
        sum += *(a+i);
    }

    printf("Sum = %d \n",sum);
}

3 个答案:

答案 0 :(得分:5)

因为您已将a声明为 array ,所以使用该变量名称的表达式本身将 通常 “衰变”到指向数组第一个元素的指针What is array decaying?-但也请参见Eric Postpischil添加的出色注释,以了解例外情况)。这类似于使用char[]字符串,正如您正确指出的那样,在将其作为参数传递给&时,不需要使用scanf运算符。

i添加到a数组的此“基地址”将为的地址(即指向的指针)提供“第i个数组元素。

这是关于pointer arithmetic in C的不错的教程,您可能会觉得有用。

答案 1 :(得分:2)

scanf通常采用其正在读取的变量的地址。 a已经是一个地址(一个退化为指针的数组),而i仅仅是该地址的偏移量。

这等效于scanf("%d", &a[i]);;它做同样的事情。

答案 2 :(得分:1)

在c中的变量之前使用的&运算符返回该变量的地址。数组的基数已经是您想要的地址。 a+i就像您正在做的那样,使用指针算法,并通过i更改数组的基地址