假设我有一些函数function
,以下原型是否完全等同于所有意义?
sometype function(sometype2 arr[],...);
sometype function(sometype2 * arr,...,);
我认为他们是,但我的教授从未真正解释过。
答案 0 :(得分:5)
是的,给出的原型是等效的。
将数组传递给函数时,实际发生的是指向数组的第一个元素的指针传递给函数。这被称为当作为参数传递时衰减为指针的数组。
在这两种情况下,sizeof arr
的值将返回指针类型的大小,在大多数系统上通常为4或8,而不是数组的字节大小。
答案 1 :(得分:0)
从编译器的角度来看,它们都是指针。
例如,当NULL
是函数参数时,您可以在函数体中将arr
指定给sometype2 arr[]
并修改地址本身;以下编译就好了:
#include <stddef.h>
void
fun1(
int *foo)
{
/* foo = &foo[1] */
++foo;
foo = NULL;
}
void
fun2(
int foo[])
{
/* foo = &foo[1] */
++foo;
foo = NULL;
}
int
main(
void)
{
int x[5] = {0, 1, 2, 3, 4};
fun1(x);
fun2(x);
}
因此,它主要只是人类的语义差异。关于你应该如何&#34;可能会有不同的思想流派。对此进行编码,但它真的取决于您需要/想要遵循的任何风格指南。如果它是个人选择的问题,你可以使用指针版本,如果你想使指针显式衰减,或者你可以使用数组版本,如果你想明确该函数接受数组而不是指向单个项目的指针。
但是,在这两个函数中,函数参数被视为指针,其中sizeof(foo)
等效于函数内的sizeof(int *)
。