Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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中对数组使用scanf()_C - Fatal编程技术网

在C中对数组使用scanf()

在C中对数组使用scanf(),c,C,众所周知,在扫描数组时,在scanf()中使用&in是可选的,但在我的程序中,当我不使用&in时,会得到不同的输出。 程序如下所示: #include<stdio.h> int main() { int n, *a, count = 0; scanf("%d",&n); a = (int*) malloc(n*sizeof(int)); for(int i = 0;i<n;i++) { scanf("%d",&am

众所周知,在扫描数组时,在scanf()中使用&in是可选的,但在我的程序中,当我不使用&in时,会得到不同的输出。 程序如下所示:

#include<stdio.h>
int main()
{
    int n, *a, count = 0;
    scanf("%d",&n);
    a = (int*) malloc(n*sizeof(int));
    for(int i = 0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i = 0;i<n;i++)
    {
        for(int j = i;j<n;j++)
        {
            if(i!=j)
            {
                if(a[i] == a[j])
                {
                    count++;
                    break;
                }
            }
        }
    }
    printf("%d",count);
    return 0;
}
#包括
int main()
{
整数n,*a,计数=0;
scanf(“%d”和“&n”);
a=(int*)malloc(n*sizeof(int));

对于(int i=0;i而言,“在扫描数组时使用&in scanf()是可选的,这是一个已知事实”的说法是错误的,或者至少是严重误导

当在
scanf
中使用
%d
时,相应的参数必须是指向
int
的指针。给定
int n
,参数可能是
&n
。给定
int*a=malloc(…)
int i
,参数可能是
&a[i]

在后一种情况下,参数也可能是
a
,因为
a
是指向
int
的指针。它指向分配空间中的第一个
int

如果声明了数组,如
inta[5]
,则通常元素的地址(如
&a[i]
)应该用作
scanf
的参数。但是,
a
也可以用作参数。这是因为数组会自动转换为指向其第一个参数的指针,实际上
&a[0]
(当数组是
sizeof
或一元
&
的参数或用于初始化数组的字符串文字时,不会发生此自动转换。)


如果
a
是一个数组,而您将
&a
传递给
%d
scanf
,那将是一个错误。
&a
不是指向
int
的指针;它是指向
int
数组的指针。即使它们指向内存中的同一位置,它们的类型也不同,后者是错误的键入以传递到
scanf

“可选择使用&in scanf()”。仅对于带有
%s
格式说明符的
char
字符串,不需要此选项。您不是将数组传递到
scanf()
,而是传递一个(指向一个)整数的指针,并且需要使用
&a[i]
。在传递字符数组以接收字符串时,不需要使用
&
。不必使用运算符的地址,也可以编写
a+i
。只有一种情况下,
&
是可选的-当将函数名转换为指向函数的指针时。在所有其他情况下,严格要求r使用它是完全错误的。众所周知,在数组上使用
&
运算符会传递错误的类型。每个现代编译器/库都会发出警告,如果您按照Wiki中的建议启用警告,简而言之:这不是可选的,而是完全错误的。更糟糕的是,您不使用数组,而是使用指针,这使其行为未定义iour。指针不是数组。(未熔合:根本不要抛出
malloc
&friends或
void*
的结果。)