函数原型中的参数

时间:2010-07-16 12:02:40

标签: c++ c arrays pointers

我的问题是:当我用C编写函数原型时:

void foo(int *vector);

这是一回事:

void foo(int vector[MAX_LENGTH]);

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

4 个答案:

答案 0 :(得分:8)

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

This解释得非常好。

答案 1 :(得分:6)

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

所以

void foo(int *a)void foo(int a[])完全相同。

您可以在函数定义

中使用sizeof()运算符轻松检查

例如

void foo(int a[])
{
   std::cout<<sizeof(a); //prints sizeof(int*)
}

int main()
{

   int a[]={1,2,3,4};
   foo(a);
}

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

[C++ Only]

 template<typename T,size_t n>
 void size_of_array(T (&a)[n]) //Array passed by reference. Template argument deduction 
 {
    std::cout<<sizeof(a); //prints sizeof(n*sizeof(int))
 }

 int main()
 {
      int a[]={1,2,3,4,5};
      size_of_array(a);
 }

答案 2 :(得分:2)

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

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

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

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

C99通过引入新关键字static; - )

进一步使这一问题复杂化
void foo(int A[static 10]) {
   int B[10];    
}

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

答案 3 :(得分:1)

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