当我运行以下代码时,我有点困惑:
int Maxi(int A[])
{
return sizeof(A)/sizeof(A[0]);
}
int main()
{
int A[5] = {1,2,3,4,5};
print("%d \n", Maxi(A));
return 0;
}
我得到结果2
。 sizeof(A)
似乎是8
,这是指针的大小。我知道这可能不是一个值得问的问题,但我必须错过一些东西,我现在无法理解。
但如果我这样做:
int main()
{
int A[5] = {1,2,3,4,5};
print("%d \n", sizeof(A)/sizeof(A[0]));
return 0;
}
那好吧,我认为这与功能之间的价值传递有关,但我很困惑。
谢谢!
答案 0 :(得分:1)
将数组作为参数传递给函数后,将数组decays传递给指针。因此,它的大小计算为8(我猜测你是在64位系统上)。 sizeof(A[0])
是4(一个整数),因此它是你的2。
它起作用的原因'在main
内,编译器能够直接从上面的静态初始化计算大小。
答案 1 :(得分:1)
您不能将整数数组传递给具有数组名称的另一个函数。
int Maxi(int A[])
等于此
int Maxi(int *A)
语法。
因此,无论何时将数组传递给另一个函数,都应该传递该数组中的元素数量。
int Maxi(int A[], int elements)
//....
// call should be
print("%d \n", Maxi(A, elements));
否则它将数组视为整数指针,它将返回指针的大小。
答案 2 :(得分:0)
当你将一个数组传递给函数时,在被调用函数Maxi中,在这种情况下,Maxi的参数声明为int A [],与int * A相同
int Maxi(int A[])
相当于:
int Maxi(int *A)
因此,传递的数组被视为被调用函数中的指针,指针的大小当然不是Maxi中数组的大小,因此,大小必须明确传递,如下所示:
int Maxi(int A[], int sz)
{
return sz/sizeof(A[0]);
}
int main()
{
int A[5] = {1,2,3,4,5};
printf("%d \n", Maxi(A, sizeof(A)));
return 0;
}
这将根据需要输出5