4 回答
TA贡献883条经验 获得超454个赞
语法设计上如此,编译器自然也要遵循这一规则了。
在使用中记住这一点就好了。 如果你一定要知道为什么当年 K&R 要设计成这样,那么...我也不知道。 不过从另一个角度想,为避免对数组参数额外的压栈开销,函数对数组参数的访问几乎都是以额外寻址的方式实现的,所以这样的设计从工程师角度来看是更符合直觉的。C语言本来就是源于工程实践的,也许这也是原因之一吧(猜)。
当然,有时候我们希望传递数组,并且希望函数对数组的访问不要越界。但因为 C 语言有这样的特性,所以很多函数在数组参数后还设计了一个整型参数。我想你应该能够猜到这个整型参数是做什么用的。对!就是让用户传入数组的大小,这样至少能让函数知道传入的数组有多大(以避免访问越界等)。
另外,C99 标准新增加了额外的语法,可以在声明函数时允许用户限定数组参数的最小容量。
语法示例: int func(int a[static 10]);
关键就是那个 static,这样限定传入的数组必须至少能容纳 10 个元素。
PS. 这个新语法似乎用的不多,大家已经习惯了老方法。
PPS. 注意,C++ 并没有这个新用法。并且再强调下,尽管看起来很像,但一定要把 C 和 C++ 看作是两门不同的语言。C++ 看似像 C 的部分在语法上和 C 有着很多微妙的差异。
PPPS. 我怎么感觉前面几个回答都是机翻呢...
TA贡献1865条经验 获得超7个赞
这是将数组传递给函数的语法的一个怪癖。
实际上,在C中传递数组是不可能的。如果您编写的语法看起来应该传递数组,那么实际发生的情况是传递一个指向数组第一个元素的指针。
由于指针不包含任何长度信息,因此[]
在函数中,形式参数列表实际上被忽略了。
- 4 回答
- 0 关注
- 738 浏览
添加回答
举报