gpt4 book ai didi

c - 在 C 中对数组使用 scanf()

转载 作者:行者123 更新时间:2023-11-30 20:09:25 24 4
gpt4 key购买 nike

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

#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;
}

当我使用 & 时,程序会打印 5,而当我不使用 & 时,程序会打印 7。有人可以解释一下这背后的原因吗?谢谢!

最佳答案

“众所周知,扫描数组时在 scanf() 中使用 & 是可选的”这一说法是错误的,或者至少具有严重误导性。

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

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

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

如果 a 是一个数组,并且您将 &a 传递给 scanf 来获取 %d,那么这将是一个错误。 &a 不是指向 int 的指针;它是一个指向int数组的指针。尽管它们指向内存中的同一位置,但它们具有不同的类型,而后者是传递给 scanf 的错误类型。

关于c - 在 C 中对数组使用 scanf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com