我的问题是:当我在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]; }
这并没有改变关于如何从内部看到A
和B
的规则,而是向调用者方提供了预期有多少数组元素的信息。 目前,gcc接受这种新语法,只是忽略了这些信息。
它没有什么可以通过的! []约束允许编译器执行更多检查。
以上就是c/c++开发分享函数原型中的参数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544680.html