这里的关键是要理解,只要我们将数组声明为函数的参数,它就会被调整为指向其第一个元素的指针。 C17 6.7.6.3强调我的:
我在互联网上找到了此代码。从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]);
}
除非它是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强调我的:
参数声明为“类型数组”应调整为
这意味着met2
和void met1(int a[1])
是100%等效的。前者由编译器静默翻译为后者。
这非常令人困惑,因为void met1(int* a)
看起来像是一个数组声明,并且可以很容易地想到数组是按值传递的。但是在C中无法通过值传递数组。
在您的情况下,本地数组int a[1]
作为其第一个元素的指针传递给b
。使用met1
可以更改指向的元素。
这里的关键是要理解,只要我们将数组声明为函数的参数,它就会被调整为指向其第一个元素的指针。 C17 6.7.6.3强调我的: