据我所知
int func(int arr[5]) {
printf("Test");
}
方括号中的数组大小(例如 5)没有任何意义,因为 arr 只是指向数组第一个元素的指针,即它与
相同int func(int *arr) {
printf("Test");
}
或
int func(int arr[]) {
printf("Test");
}
但是,如果数字本身没有任何意义,为什么可以在方括号中写下 5 这样的数字呢?
确实,数组符号被调整(“衰减”)为指向第一个元素的指针,使所有 3 个示例等效。该语言的设计方式是为了使表达式中的数组使用与函数兼容,因为当在大多数表达式中使用数组时,它也会“衰减”为指向第一个元素的指针。
尺寸确实有点意义:
您可以通过声明参数
int arr[static 5]
来稍微提高类型安全性,其中 static
表示传递 至少 5 个项目,而不是空指针。现代编译器可能会给出诊断消息:
#include <stdio.h>
void func(int arr[static 5])
{
printf("Test");
}
int main(void)
{
int a[5];
func(a); // ok
int* b;
func(b); // accepted
int c[4];
func(c); // not ok
func(NULL); // not ok
}
您还可以将参数声明为指向数组的指针
int (*arr)[5]
。这进一步提高了类型安全性,因为这意味着 必须传递恰好 5 个 int 的数组。但这使得该函数使用起来更加麻烦,因为在使用它时您必须将参数取消引用为 (*arr)[i]
。数组参数必须作为 func(&a)
传递。