[英]How to get an array size in a function without counting or passing the length as a parameter?
我尝试使用sizeof(array)/sizeof(int)
,但是如果我将数组传递给另一个函数,这似乎不起作用。 那么还有其他方法可以知道数组的大小吗?
顺便说一句:我知道char[]
以'\\0'
结尾; 哪个字符结束int[]
?
在C语言中, 数组和数据指针之间存在差异。 当“将数组传递给函数”时,实际上是将指针传递给函数。 不幸的是,您不知道指针是指向一个元素还是指向元素序列,因此无法确定该序列包含多少个元素。
另外,与字符串不同,int数组不以特定值结尾。
如果将char数组显式地视为以null终止的字符串,则char数组只能以\\0
结尾。 通常,数组没有终止符,没有传递数组大小就无法知道数组的大小。
当数组类型的表达式出现在大多数上下文1中时 ,它会隐式转换(“衰减”)为指针类型的表达式,其值是数组中第一个元素的地址。 类似地,在函数参数声明的上下文中(但仅在该上下文中),诸如T a[]
和T a[N]
被解释为T *a
; 尽管使用了数组符号,但参数a
是指针,而不是数组类型。
所以给定的代码像
int arr[10];
...
foo(arr);
在对foo
的调用中,表达式arr
的类型为“ int
10个元素的数组”。 在这种情况下,表达式的类型将转换为“ pointer to int
”,因此foo
将接收一个指针值。
同样,给定一个函数定义
void foo(int a[10])
{
...
}
参数a
的类型不是 “ int
10元素数组”,而是“ int
指针”。
简而言之,您不能将数组参数传递给函数,并且不能将其作为数组类型接收。 您得到的只是一个指针值。 因此,您必须将数组大小作为单独的参数传递,或者使用前哨值终止数组(例如,在char
数组中使用0终止字符串)。
1此规则的例外情况是:数组表达式作为sizeof
或一元&
运算符的操作数出现,或者它是用于初始化声明中另一个数组的字符串文字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.