首页 > 解决方案 > 数组 b[] 的值如何被另一个函数的另一个数组 a[] 值填充?

问题描述

我在互联网上找到了这段代码。我从 1 小时开始就感到困惑。我发现奇怪的是数组 b[] 在具有本地范围的 met2() 函数内。还有另一个数组 a[] 位于 met1() 函数内部,具有本地作用域。但是如何将 a[] 的值转移到 b[] 数组。最重要的是,这两个函数都没有返回任何值。这太令人困惑了。请帮帮我。我在网上搜索,但没有人问过这样的问题。

#include <stdio.h>
int main()
{
    met2();
    return 0;
}
void met1(int a[1])
{
    a[0]=199;
}
void met2()
{
    int b[1];
    met1(b);
    printf("%d",b[0]);
}

标签: carraysfunctionparameters

解决方案


这里的关键是要理解,每当我们将数组声明为函数的参数时,它都会被调整为指向其第一个元素的指针。C17 6.7.6.3 强调地雷:

将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在数组类型派生的 [ 和 ] 中指定的那些。

这意味着void met1(int a[1])void met1(int* a)100% 等效。前者被编译器默默地翻译成后者。

这很令人困惑,因为int a[1]它看起来像一个数组声明,人们可能很容易想到数组是按值传递的。但是在 C 中不可能按值传递数组。

在您的情况下,本地数组作为指向其第一个元素的指针b传递给。met1随着a[0] = ...那个指向的元素被改变。


推荐阅读