繁体   English   中英

如何在不计算长度或将长度作为参数传递的情况下获取函数中的数组大小?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM