如果我不想传递元素的数量,我怎么能计算数组中元素的数量呢?
fun(a, sizeof(a)/sizeof(*a));
并收到
int fun(int a[], int limit)
{
}
答案 0 :(得分:1)
如何计算数组中元素的数量
你不能。
如果我不想将元素数量作为另一个参数传递
你必须。
这是C,没有婴儿保姆或魔杖。如果你需要跟踪一条信息(比如阵列的长度),你必须自己动手。这种显式性是我们使用C的原因,因此我们知道完全正在进行什么,而编译器不会在我们的背后做出疯狂的事情。
你会看到这样的宏:
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))
但 要小心! 这仅适用于数组,其中大小在编译时已知。它将不用于任意指针。
Linux内核以安全的方式提供此宏:
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
答案 1 :(得分:0)
如果你这样做:
main()
{
int a[]={1,2,3};
fun(a);
}
fun(int a[])
{
}
您没有将数组作为副本传递。它只是一个指向第一个元素在内存中的地址的指针。
但它会起作用:
#include <stdio.h>
int fun(int*, int);
int main(void)
{
int a[] = {1,2,3,4,5,6,7};
int si=sizeof(a)/sizeof(a[0]);
int b=fun(a, si);
return 0;
}
int fun(int ar[], int si)
{
int i = 0;
printf("size of a==%d\n",si);
for(i=0; i<si; i++)
printf("%d ",ar[i]);
}
答案 2 :(得分:0)
声明
int fun(int someArray[])
相当于
int fun(int *someArray)
也就是说fun
收到的关于数组的唯一信息是指向第一个元素的指针。因此,确定数组大小的唯一方法(除了将大小作为单独的参数传递)是将一个sentinel放在数组的末尾。 sentinel是一个否则不会出现在数组中的值。
例如,以下代码使用值-1
作为数组末尾的标记。
#include <stdio.h>
void fun(int a[])
{
int i;
for ( i=0; a[i] >= 0; i++ )
printf("%d ", a[i]);
printf( "\nArray has %d elements\n", i );
}
int main( void )
{
int a[] = {1,2,3,4,5,6,7,-1};
fun(a);
return 0;
}
这实际上是字符串在C中的工作方式.NUL终结符'\0'
在字符数组的末尾充当标记,因此字符串长度不必作为单独的参数传递给所有字符串字符串函数。