数组的下标是从0开始的,并非从1
因此假设定义数组int a[3],那么有效的数组元素为a[0] a[1] a[2]
楼组的代码里面的数组从1开始使用,输入3*3的数组会导致越界,踩内存发生错误
void fun(int arr[M][N]){
int i,j
for(i=1i<=Mi++) //应该是for(i=0i<Mi++)
for(j=1j<=Nj++)
scanf("%d",&arr[i][j])
}
其他也按照这个修改就可以了
可以通过循环遍历数组中的每个元素,并进行累加。累加的结果可以保存在变量中,需要注意,要保证变量足够保存累加结果,不会出现溢出。
参数为整型数组a,长度为l,对其元素实现累加并返回结果的函数可以写作
int sum(int *a, int l)
{
int r = 0 // 存储累加结果。
int i
for(i = 0 i < l i ++)//遍历a
r += a[i]//累加元素。
return r//返回结果。
}
定义int arr[5] = {20, 10, 5, 39, 88}时,系统产生一个有5个元素的一维数组,5个元素分别是arr[0]到arr[4],对应的各个元素的地址分别是arr到arr+4。当用sum(arr, arr + 5))计算数组总和时,sum是一个自定义函数,其内容是由编程人书写的。
如果这个函数是这样写:
int sum(int*a,int*b){
int*p,s
for(p=a,s=0p<bp++)
s+=*p
return s
}
就能得到正确的结果。
你说的“arr指向数组的首地址”是正确的,但“对arr+5后不是相当于arr[6]了吧”是错误的,因为arr+5是元素arr[5]的地址。但即使这样,如果自定义函数不加arr[5](像上面的例子),程序是能够得到正确的结果的。但是,如果不这样写,可能会造成这样数组下标越界。
这取决于函数sum是怎样写的。
最主要的,sum后面的arr与arr+5,只是两个参数,并不是加法的对象,这一点一定要搞清楚。