C 如何在函数中获得数组大小而不计算长度或将长度作为参数传递?

C 如何在函数中获得数组大小而不计算长度或将长度作为参数传递?,c,arrays,C,Arrays,我尝试使用sizeof(array)/sizeof(int),但如果我将数组传递到另一个函数中,这似乎不起作用。那么,还有其他方法可以知道数组的大小吗 顺便说一下:我知道一个char[]以'\0'结尾;哪个字符以int[]结尾 如果字符数组被显式地视为以null结尾的字符串,则它只能以\0结尾。通常,数组上没有终止字符,如果不传递数组的大小,就无法知道数组的大小 在C语言中,数组和指向数据的指针是有区别的。当“将数组传递给函数”时,实际上是传递一个指向函数的指针。不幸的是,您不知道指针是指向一个

我尝试使用
sizeof(array)/sizeof(int)
,但如果我将数组传递到另一个函数中,这似乎不起作用。那么,还有其他方法可以知道数组的大小吗


顺便说一下:我知道一个
char[]
'\0'
结尾;哪个字符以
int[]
结尾

如果字符数组被显式地视为以null结尾的字符串,则它只能以
\0
结尾。通常,数组上没有终止字符,如果不传递数组的大小,就无法知道数组的大小

在C语言中,数组和指向数据的指针是有区别的。当“将数组传递给函数”时,实际上是传递一个指向函数的指针。不幸的是,您不知道指针是指向一个元素还是指向一个元素序列,也不可能知道该序列由多少个元素组成


此外,与字符串不同,int数组不会以特定值结尾。

当数组类型的表达式出现在大多数上下文1中时,它会隐式转换(“衰减”)为指针类型的表达式,其值是数组中第一个元素的地址。类似地,在函数参数声明的上下文中(但仅在该上下文中),像
ta[]
ta[N]
这样的声明被解释为
T*a
;尽管使用了数组表示法,但参数
a
是指针,而不是数组类型

因此,给定如下代码

int arr[10];
...
foo(arr);
调用
foo
中表达式
arr
的类型是“int的10元素数组”。在此上下文中,表达式的类型转换为“指向
int
”的指针,因此
foo
将接收指针值

类似地,给定一个函数定义

void foo(int a[10])
{
  ...
}
参数
a
的类型不是“int的10元素数组”,而是“指向int的指针”

简而言之,不能将数组参数传递给函数并将其作为数组类型接收;得到的只是一个指针值。因此,必须将数组大小作为单独的参数传递,或者使用sentinel值终止数组(例如在
char
数组中使用0终止字符串)


1此规则的例外情况是当数组表达式作为
sizeof
或一元
&
运算符的操作数出现时,或者如果它是用于初始化声明中另一个数组的字符串文字