我的问题是:当我用C编写函数原型时:
void foo(int *vector);
这是一回事:
void foo(int vector[MAX_LENGTH]);
对于函数,总是作为指针传递?代码是一样的吗? 提前谢谢。
答案 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];
}
这不会改变关于如何从内部看到A
和B
的规则,而是向调用方提供有关预期有多少数组元素的信息。目前,gcc接受这种新语法,只是忽略了这些信息。
答案 3 :(得分:1)
没有别的东西可以通过! []约束允许编译器执行更多检查。