使用指针参数
使用数组的函数需要知道我何时开始和结束数组。函数sum()使用一个指针参量来确定数组的开始点,使用一个整数参量来指明数组的元素个数(指针参量同时确定了数组中数据的类型)。但是这并不是向函数传递数组信息的唯一方法。另一种方法是传递两个指针,第一个指针指明数组的起始地址,第二个指针指明数组的结束地址。
下面的程序使用了这种方法,这个例子同时利用了指针参数是变量这一事实,也就是说,程序中没有使用索引来指示数组中的每个元素,而是直接修改指针本身,使指针依次指向各个数组元素。
//sum_arr1.c --对一个数组的所有元素求和
#include
#define SIZE 10
int sump(int * start, int * end);
int main(void)
{
int marbles[SIZE] = { 20,10,5,39,4,16,119,26,31,20 };
long answer;
answer = sump(marbles, marbles + SIZE);
printf("The total number of marbles is %ld.\n", answer);
return 0;
}
/*使用指针算术*/
int sump(int * start, int * end)
{
int total = 0;
while (start < end)
{
total += *start;
start++;
}
return total;
}
输出结果为:
The total number of marbles is 290.
由于最初指针start最初指向marbles的首元素,因此执行赋值表达式total+=*start时,把首元素的值(即20)加到total上。然后表达式start++使指针变量start增1,从而指向数组的下一个元素。start是指向int的指针,所以当start增1时,它将增加1个int的大小。
一元运算符* 和++具有相等的优先级,但它在结合时是从右向左进行的。这就意味着++应用于start,而不是应用于* start。也就是说,是指针自增1,而不是指针所指向的数据自增1。后缀形式(即start++)表示先把指针指向的数据加到total上,然后指针再自增1.如果程序使用*++start,则顺序就会变为 指针先自增1,然后再使用其指向的值。然而如果程序使用(*start)++,那么会使用start所指向的数据,然后使该数据自增1,而不是指针自增1.这样,指针所指向的地址不变,但其中的元素却变成了一个新数据。尽管*start++比较常用,但是为了清晰起见,应该使用*(start++)。
下面的程序示意了这些有关优先级的微妙之处。
/*order.c----指针运算的优先级*/
#include
int data[2] = { 100,200 };
int moredata[2] = { 300,400 };
int main(void)
{
int * p1, *p2, *p3;
p1 = p2 = data;
p3 = moredata;
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;
}
输出结果如下:
*p1=100, *p2=100, *p3=300.
*p1++=100, *++P2=200, (*p3)++=300.
*p1=200,*p2=200,*p3=301.
上面的例子中只有(*p3)++改变了数组的元素的值。其他的两个操作增加了指针p1和p2,使之指向下一个数组元素。