我知道可以通过sizeof(the_array)/sizeof(the_array[n])来计算数组元素的数量,但如果我必须写一个函数
我不知道该怎么做不可能在函数调用的参数中传递数组类型的对象(除非该数组作为结构体或联合类型的成员嵌入),因为数组会"衰减"。指向它的第一个元素的指针(C11 6.3.2.3/3)。
同样,函数声明中任何数组类型的形参都将自动调整为指针类型。例如,int foo(const int bar[5])
自动调整为int foo(const int *bar)
(C11 6.7.5.3/7或C17 6.7.6.3/7)。
可以定义一个宏来获取数组的长度,但要由程序员来确保形参确实是一个数组,而不是一个指针:
#define ARRAYLEN(arr) (sizeof (arr) / sizeof *(arr))
例如,它不能用于函数的形参,即使函数的形参类型看起来像数组,因为函数的形参类型实际上是指针:
#define ARRAYLEN(arr) (sizeof (arr) / sizeof *(arr))
size_t foo(int bar[5])
{
return ARRAYLEN(bar); // INCORRECT! bar is a pointer, not an array.
}
不,不是你说的那个意思。
当数组用作函数实参时,将自动转换为指向其第一个元素的指针。C标准只指定该指针指向数组的第一个元素,而不指定它包含关于数组的任何其他信息。C标准也没有规定有任何方法可以从传递给函数的指针或任何其他信息中获取数组的大小。
如果你想让一个函数知道数组的大小,把数组的大小作为一个单独的参数传递。
(C实现可以通过将其包含在指针中,将其与指针关联,或将其存储在数组开始之前来提供此信息。我不知道有任何这样做,除了调试功能可能提供此信息。