Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在下面的代码中不需要符号和?_C_Pointers_Scanf - Fatal编程技术网

C 为什么在下面的代码中不需要符号和?

C 为什么在下面的代码中不需要符号和?,c,pointers,scanf,C,Pointers,Scanf,我知道在C编程中,scanf”与“&”一起用于除字符串以外的所有变量类型(int、float、char等)。这是我的程序代码。在“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

我知道在C编程中,scanf”与“&”一起用于除字符串以外的所有变量类型(int、float、char等)。这是我的程序代码。在“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);
}
#包括
#定义M 10
int main()
{
int i,n,和=0;
int a[M];
做{
printf(“输入一个小于%d\n”,M的正数);
scanf(“%d”和“&n”);
}而(!(n>0&&n对于(i=0;i在c中变量之前使用的
&
运算符返回该变量的地址。数组的基已经是您想要的地址。
a+i
就像您正在做的一样,使用指针算术并通过i

更改数组的基地址,因为您已将
a
声明为数组,表达式使用该变量的名称本身通常会“衰减”到指向数组第一个元素的指针(但也请参见Eric Postischil添加的优秀注释以了解例外情况)。这类似于使用
char[]
字符串,正如您正确指出的,在将其作为参数传递给
scanf
时,不需要使用
&
运算符

i
添加到
a
数组的此“基址”将给出数组的第i个元素的地址(即指向该元素的指针)


这是一个不错的教程,您可能会发现它很有用。

scanf
通常会获取它读取到的变量的地址。
a
已经是一个地址(一个衰减为指针的数组),而
i
只是该地址的偏移量


这相当于
scanf(“%d”和
;它做同样的事情。

a+i
是一个地址;
*(a+i)
是一个值。如果你想使用
你可以这样做:
scanf(“%d”和
,我想大多数人会喜欢它。
a
是一个数组…
scanf
scanf(“%d”和&a[i]);
…顺便说一句,我应该先开始学习,然后再开始思考一些事情,比如我知道在C编程中,“scanf”与“&”一起用于所有变量类型(int、float、char等)@FiddlingBits之美就在旁观者的眼中,但我永远无法理解为什么一个人会去引用一个指针来获得一个对象(
a[I]
),而仅仅是为了得到一个指向这个对象的指针,而这个对象正是通过去引用这个指针而获得的。
&a[I]
就是
&(*(a+I))
这显然是荒谬的。@Peter和monica的最终结果(机器代码)可能是完全相同的。我认为清晰是最重要的。@FiddlingBits我认为冗余越少越好。那么为什么我需要在代码“scanf”(%d“,&a[I])处添加“&”?
(a+I)
将返回
i
索引处元素的地址,而
a[i]
将返回
i
索引处的值。因此,您需要
&
来获取值的地址。数组名称本身不是指向数组第一个元素的指针。数组名称本身指定数组。当它用于表达式中时,而不是作为
sizeof
或una的操作数ry
&
,然后是数组(从技术上讲,不是它的名称)自动转换为指向其第一个元素的指针。虽然这可能是在表达式中使用数组的大多数情况,但教人们有关数组的错误语句会导致他们犯其他错误,我们在其他堆栈溢出问题中反复看到这些错误。请教给正确的规则。@EricPostIschilcellent point,Eric-谢谢你这么做!我已经更新了我的答案来解决(请原谅双关语)这个问题-希望你同意。