假设待处理的是名为a的int类型的数组。
int a[];
total=sum(a);//函数调用
由于数组名是数组首元素的地址,所以实际参数a是一个存储int类型值的地址,应当把他赋给一个指针形式参数,即该形参是一个指向int的指针。
int sum(int *ar);//对应的函数原型。
声明数组形参
int sum(int *ar,int n);
int sum(int *,int);
int sum(int a[],int n);
int sum(int [],,int);
数组函数定义
int sum(int *ar,int n);
int sum(int a[],int n);
函数处理数组要知道数组何时开始何时结束
方法一:使用一个指针形参标识数组的开始,用一个整数形参表明待处理数组的元素个数。
#include <stdio.h>
#include <stdlib.h>
#define size 10
int sum(int ar[],int nr);
int main(int argc, char *argv[]) {
int a[size]={10,20,39,4,5,16,26,31,19,20} ;
int t;
t=sum(a,size);
printf("%d",t);
return 0;
}
int sum(int ar[],int nr)
{int i;
int t=0;
for(i=0;i<nr;i++)
{t+=ar[i];
printf("%d %d\n",i,ar[i]);
}
return t;
}
捕获.PNG
方法二:传递两个指针,第一个指针指明函数的开始处,另一个指针指明函数结束的位置。
#include <stdio.h>
#include <stdlib.h>
#define size 10
int sum(int ar[],int arr[]);
int main(int argc, char *argv[]) {
int a[size]={10,20,39,4,5,16,26,31,19,20} ;
int t;
t=sum(a,a+size);
printf("%d",t);
return 0;
}
int sum(int ar[],int arr[])//ar[]相当于*ar
{int i;
int t=0;
while (ar<arr)
{t+=*ar;
ar++;//地址++
}
return t;
}
t+=*ar;
ar++;
可改成
t+=*ar++;等价与*(a++)
一元运算符
*
和++的优先级相同,但结合律是从右往左,所以ar++先求值,然后才是
*ar
。也就是说ar先递增后指向。
使用后缀(ar++而不是++ar)意味着先把指针指向位置上的值加给t,然后再递增指针。(对t而言的先后)
#include <stdio.h>
#include <stdlib.h>
int main (void)
{int a[2]={100,200};
int b[2]={300,400};
int *p1,*p2,*p3;
p1=p2=a;
p3=b;
printf("*p1=%d *p2=%d *p3=%d\n",*p1,*p2,*p3);
printf("*p1++=%d *++p2=%d (*p3)++=%d\n",*p1++,*++p2,(*p3)++);
printf("*p1=%d *p2=%d *p3=%d\n",*p1,*p2,*p3);
return 0;
}
捕获.PNG
*P++==*P(++)
先对原先的p地址取值,然后递增,等下次用到*p时取的是递增后对应地址的值。
*++P
先对原先的p递增,然后取递增后对应位置上的值。