//Arrays as function arguments
#include
int SumOfElements(int A[])
{
int i,sum = 0;
int size = sizeof(A)/sizeof(A[0]);
for (i=0;i
{
sum+= A[i];
}
return sum;
}
int main()
{
int A[] = {1,2,3,4,5,};
int total = SumOfElements(A);
printf("Sum of elements = %d\n",total);
}
为什么编译出来sum of elements =1?
我们要在函数中使用数组长度时,可以在外部先用sizeof(arr)/sizeof(arr[0])求出数组长度,然后将他的长度作为一个参数传递进去。
因为当数组作为函数参数传递的时候,sizeof()将数组看作指针,结果是指针的大小,而非整个数组所占内存
因此改了一下代码就好了:
#include<stdio.h>
int SumOfElements(int A[],int &size)
{
int i,sum = 0;
for (i=0;i<size;i++)
{
sum+= A[i];
}
return sum;
}
int main()
{
int A[] = {1,2,3,4,5,};
int size = sizeof(A)/sizeof(A[0]);
int total = SumOfElements(A,size);
printf("Sum of elements = %d\n",total);
}
结果:
你把你那个SumOfElements 的形参,改成int *A,然后再试试看
你会发现结果是一样的,为什么???
那是因为 A[] 和 指针是一个意思,sizeof 都是4
数组作为参数传递时,实际只是作为指针传递,函数内不知道这个指针指向的空间是个数组,所以不能使用sizeof(A)计算数组长度。数组传递时,函数需要加上数组长度参数才可以。
数组传参其实传的传的是数组的首元素地址,用int A[]接收的是主函数数组首元素地址,其实int A[]人魔狗样,本质上是一个指针,int A[]等价于int *A;主函数将数组A的首地址传过来,所以自定义的数组其实本质上接收的是首元素地址,则在自定义函数中sizeof(A)=4,而sizeof(A[0])=4,所以sizeof(A) / sizeof(A[0])=1。
//Arrays as function arguments
#include<stdio.h>
int SumOfElements(int A[])
{
int i, sum = 0;
int size = sizeof(A) / sizeof(A[0]);
printf("size=%d\n", size);
for (i = 0;i < size;i++)
{
sum += A[i];
}
return sum;
}
int main()
{
int A[] = { 1,2,3,4,5, };
int total = SumOfElements(A);
printf("Sum of elements = %d\n", total);
}