gpt4 book ai didi

c - C 中将数组和数组指针传递给函数的区别

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

C 语言中这两个函数有什么区别?

void f1(double a[]) {
//...
}

void f2(double *a) {
//...
}

如果我要在一个相当长的数组上调用函数,这两个函数的行为是否会有所不同,它们会在堆栈上占用更多空间吗?

最佳答案

首先,一些standardese :

6.7.5.3 Function declarators (including prototypes)
...
7 A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of thearray type derivation. If the keyword static also appears within the [ and ] of thearray type derivation, then for each call to the function, the value of the correspondingactual argument shall provide access to the first element of an array with at least as manyelements as specified by the size expression.

因此,简而言之,任何声明为 T a[]T a[N] 的函数参数都会被视为如同声明T *a

那么,为什么数组参数被视为被声明为指针呢?原因如下:

6.3.2.1 Lvalues, arrays, and function designators
...
3 Except when it is the operand of the sizeof operator or the unary & operator, or is astring literal used to initialize an array, an expression that has type ‘‘array of type’’ isconverted to an expression with type ‘‘pointer to type’’ that points to the initial element ofthe array object and is not an lvalue. If the array object has register storage class, thebehavior is undefined.

给出以下代码:

int main(void)
{
int arr[10];
foo(arr);
...
}

在对 foo 的调用中,数组表达式 arr 不是 sizeof& 的操作数>,因此根据 6.2.3.1/3,其类型从“int 的 10 元素数组”隐式转换为“指向 int 的指针”。因此,foo 将接收一个指针值,而不是一个数组值。

由于 6.7.5.3/7,您可以将 foo 写为

void foo(int a[]) // or int a[10]
{
...
}

但它会被解释为

void foo(int *a)
{
...
}

因此,这两种形式是相同的。

6.7.5.3/7中的最后一句是在C99中引入的,基本上意味着如果你有一个像这样的参数声明

void foo(int a[static 10])
{
...
}

a对应的实际参数必须是一个至少 10个元素的数组。

关于c - C 中将数组和数组指针传递给函数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32414017/

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