数组b []的值如何用另一个函数的另一个数组a []值填充?

问题描述 投票:-2回答:2

我在互联网上找到了此代码。从1小时起我感到困惑。我发现很奇怪的是,数组b []在具有局部范围的met2()函数内部。在met1()函数内部还有另一个数组a [],它具有本地范围。但是如何将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]);
}
c arrays function parameters
2个回答
0
投票

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则expression类型为[[ C0]”被转换(“衰减”)为类型为“ T”的指针,该表达式的值是数组第一个元素的地址。

通话时

T

表达式 met1(b); 从类型“ b的1元素数组”转换为“指向int的指针”,并且表达式的值是int的地址。 >

在函数原型中]

b[0]

参数声明void met1(int a[1]) 被“调整”为int a[1]-实际上它被声明为指针(这很方便,因为函数实际上是接收到的)。

因此[int *a调用met2时,它将传递met1的第一个元素的地址。 b运算符可用于指针和数组(它实际上是根据指针算术定义的-[]被解释为a[i])。

因此,在*(a + i)中写入a[0] = 199;等同于在met1中写入b[0] = 199;

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

参数声明为“类型数组”应调整为

“限定类型指针”,其中类型限定符(如果有的话)是在数组类型派生。

这意味着met2void met1(int a[1])是100%等效的。前者由编译器静默翻译为后者。

这非常令人困惑,因为void met1(int* a)看起来像是一个数组声明,并且可以很容易地想到数组是按值传递的。但是在C中无法通过值传递数组。

在您的情况下,本地数组int a[1]作为其第一个元素的指针传递给b。使用met1可以更改指向的元素。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.