函数、数组与指针(2)

使用指针参数

使用数组的函数需要知道我何时开始和结束数组。函数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,使之指向下一个数组元素。

 

你可能感兴趣的:(C,C++学习)