在C语言中,如何将数组传递给函数?

在C语言中,如何将数组传递给函数?,c,arrays,pointers,C,Arrays,Pointers,上面的代码旨在返回数组的长度。但是,当我尝试从main()调用length时,出现了一个错误: 如何正确地将数组传递到长度?按以下方式定义函数 cannot convert int(*)[10] to int** for argument 1 to int length(int**) 在一般情况下,如果要将数组传递给函数,则还应自己传递其大小,因为在表达式(包括参数)中使用数组时,数组将转换为指向其第一个元素的指针 例如,这三个函数声明是等价的,并且声明了相同的函数 int length( i

上面的代码旨在返回数组的长度。但是,当我尝试从main()调用length时,出现了一个错误:


如何正确地将数组传递到长度?

按以下方式定义函数

cannot convert int(*)[10] to int** for argument 1 to int length(int**)
在一般情况下,如果要将数组传递给函数,则还应自己传递其大小,因为在表达式(包括参数)中使用数组时,数组将转换为指向其第一个元素的指针

例如,这三个函数声明是等价的,并且声明了相同的函数

int length( int ( *array )[10])
{
    int len = sizeof(*array) / sizeof( ( *array )[0]);
    printf("The array is of length %d\n",len);
    return len;
}
  • 当您在
    main()
    中执行
    sizeof(array)
    时,您将得到数组的大小,即
    元素数*int的大小
  • 当您在
    length()
    中执行
    sizeof(*array)
    时,您将得到指针的大小,即
    int的大小
因此,当您将
数组
发送到
length()
时,实际上是在发送
数组
的基址。当我们将变量的地址传递给函数时,它会将地址存储在指针中。 因此,如果您尝试获取
数组的大小,您将获得指针的大小

如何正确地将数组传递到长度

如果要计算数组的长度,可以在
main()
中进行


len=sizeof(数组)/sizeof(int)

数组不是指针。指针不是数组。数组传递给函数时,会衰减为指向其第一个元素的指针。因此,不可能编写返回数组长度的函数
int*array[]
不是指向数组的指针,它在其他上下文中可能是指针数组,但在函数声明中,它是指向指针的指针。将数组传递给函数时,它会衰减为指向数组开头的指针。所以
sizeof
不会告诉你正确的长度。顺便说一句,如果你在谷歌上搜索,那么前四个结果都是指向相同问题的链接,这一个是重复的。“使用谷歌真的有那么难吗?”我没有意识到问题在于使用sizeof,否则我会搜索它。无论如何,我感谢您最初的建设性回复,我现在理解了我的错误。在C语言中,您不能将数组传递给函数。您可以将指针传递给它的第一个元素和长度(通常是这样);您可以将数组包装在一个结构中并传递该结构,…这会有用吗?不,因为你只能给它传递一个由10个元素组成的数组。@顺磁性牛角面包,这不是你的问题。我演示了如果参数是expression&array,如何正确定义函数。因此,它对本主题的作者非常有用。“上面的代码是为了返回数组的长度”-它不是为了返回大小为10的数组的长度。这意味着返回任意元素数组的长度。(正如我提到的,这是不可能的。)@顺磁性羊角面包读了他的题目。读问题本身。OP的帖子,就像许多其他问题一样,有一个误导性/不相关的标题。真正的问题显然不是“如何将数组传递给函数”,而是“如何编写返回数组计数的函数”。这是一个很好的答案。为什么它被否决了?即使我很惊讶地看到否决票……唯一有意义的可能性是,“它没有回答OP关于如何编写
length
函数来实现这一点的问题”,对此我会回答,“除了使用sentinel值终止的数组(不一定是这样,而且由于必须搜索整个数组以查找sentinel值,因此计算速度也会变慢)之外,您必须将长度传递给任何函数,因为数组会衰减为指针,从而破坏函数的用途。可以使用类似宏的函数,如
#define length(array)(sizeof array/sizeof*array)
,但不能使用函数。“指针的大小可能不等于int的大小。
int length( int ( *array )[10])
{
    int len = sizeof(*array) / sizeof( ( *array )[0]);
    printf("The array is of length %d\n",len);
    return len;
}
void f( int array[10] );
void f( int array[] );
void f( int *array );