函数原型中的参数

我的问题是:当我在C中编写函数原型时,如下所示:

void foo(int *vector); 

这是一回事:

 void foo(int vector[MAX_LENGTH]); 

到函数,总是作​​为指针传递? 代码是一样的吗? 提前致谢。

这很微妙。 C中的数组不是指针,但C不允许将数组作为函数参数传递。 所以当你有void foo(int vector[MAX_LENGTH]); ,基本上你所做的就是告诉其他程序员(以及你未来的自己),这个函数需要传递一个MAX_LENGTH数组。 编译器不会帮助你。 它会以静默方式将数组转换为指针。

这很好地解释了它。

是的,数组类型在传递给函数时会隐式转换为指针类型。

所以

void foo(int *a)void foo(int a[])是相同的。

您可以在函数定义中使用sizeof()运算符轻松检查

例如

 void foo(int a[]) { std::cout< 

EXTRA (在函数内打印数组的大小)

[C++ Only]

  template void size_of_array(T (&a)[n]) //Array passed by reference. Template argument deduction { std::cout< 

这是C语言的粗略边缘之一。 两个看起来完全相同(但对于名称)的声明,一个在原型中,一个作为堆栈变量,导致声明两种不同类型的变量。

 void foo(int A[10]) { int B[10]; } 

foo的范围内, A指向int的指针B十个int类型的元素的数组 。 正如其他人提到的那样,即使用sizeof计算的尺寸也不同。

C ++inheritance了规则,因此对于您的示例代码,两个函数的原型应该是相同的。

通过引入新的关键字static C99进一步使这个问题复杂化;-)

 void foo(int A[static 10]) { int B[10]; } 

这并没有改变关于如何从内部看到AB的规则,而是向调用者方提供了预期有多少数组元素的信息。 目前,gcc接受这种新语法,只是忽略了这些信息。

它没有什么可以通过的! []约束允许编译器执行更多检查。