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
或一元&
运算符的操作数出现时,或者如果它是用于初始化声明中另一个数组的字符串文字