先让我们来看一段非常简单的代码:
#include<stdio.h>
#include<stdlib.h>
int arraysum (int array[], const int n)
{
int sum = 0, *ptr;
for (ptr=array; ptr <= array + n; ++ptr)
sum += *ptr;
return sum;
}
int main (void)
{
int arraysum (int array[], const int n);
int values[10]={3,7,-9,3,6,-1,7,9,1,-5};
printf("The sum is %i\n",arraysum(values,10);
return 0;
}
在函数内部,我们定义了整形指针变量ptr用来遍历数组形参。每一次循环都将ptr间接取得的数值加入SUM中。这样,我们就完成了一个数组的元素进行求和的函数。
你会问,这断码有什么可优化的吗?
请看如下代码:
#include<stdio.h>
#include<stdlib.h>
int arraysum (int array[], const int n)
{
int sum = 0, *ptr;
int * const arrayEnd = array + n;
for (ptr=array; ptr <= arrayEnd; ++ptr)
sum += *ptr;
return sum;
}
int main (void)
{
int arraysum (int array[], const int n);
int values[10]={3,7,-9,3,6,-1,7,9,1,-5};
printf("The sum is %i\n",arraysum(values,10);
return 0;
}
修改后的代码我们定义了整形指针常量arrayEnd,并将其指向数组最后一个元素的后面。
使用arrayEnd的唯一目的是为了优化。每一次循环,程序都要计算循环条件表达式。
因为我们在循环里从没改变表达式array+n,所以它在循环中为一个常量。如果我们在进入循环前将它计算出来,我们就可以省去每一次循环中计算这个常量的时间。 也许在这个10个元素的数组中不能体现出它的效率。但是如果程序频繁的调用这个函数对一个很大的数组求和,例如中国人均收入,那么节省下来的时间就相当可观了!