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

标签 c

众所周知,扫描数组时在 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/

相关文章:

javascript - C++ 中的 unsigned short * 和 wchar_t 错误

c - printf 输出在 scanf 之后被 "\n"破坏

c - 从函数返回结构体的动态数组

我可以通过 C 套接字发送 json 数据吗?

c - 执行 arm blx rx 时出现 EXC_BAD_ACCESS

c - Printf 返回的是从 scanf 输入的错误数字

c - 把所有东西都放在头文件中有什么*真正的*问题吗?

c - 安装/卸载 C Windows 服务

c - 如何查找多个出现的位置并使用字符串进行替换?

c - 自定义 Windows 身份验证包的实现 - LsaApUserLogonEx