问题在于,在循环的条件下,您使用的是在循环内更改的指针。
while ( p < p+n ){
printf("Sum of array is %d\n",sum);
sum += *p++;
}
所以条件永远不会等于 false,除非 n 等于 0。
函数可以通过以下方式声明和定义
long long int sum_array( const int *p , size_t n );
注意函数内部数组是没有变化的。所以第一个参数应该有限定符 const。
和
long long int sum_array( const int *p , size_t n )
{
long long int sum = 0;
for ( const int *q = p; q < p + n; ++q )
{
sum += *q;
}
return sum;
}
如果要使用while循环,则需要在循环外定义指针q
const int *q = p;
while ( q < p + n )
{
sum += *q++;
}
同时进行以下更改
#define LEN(a) (sizeof(a)/sizeof(a[0]))
和
printf("Array length %zu\n",LEN(a));
long long int sum = sum_array(a,LEN(a));
printf( "Sum of array is %lld\n",sum);
long long int 类型用于变量sum,因为通常可能存在溢出。
以下面的演示程序为例
#include <stdio.h>
#include <limits.h>
#define LEN(a) (sizeof(a)/sizeof(a[0]))
int sum_array( const int * , size_t );
int main(void)
{
int a[] = { INT_MAX, 1 };
printf("Array length %zu\n",LEN(a));
int sum = sum_array( a, LEN( a ) );
printf("Sum of array is %d\n",sum);
return 0;
}
int sum_array( const int *p , size_t n )
{
int sum = 0;
const int *q = p;
while ( q < p + n )
{
sum += *q++;
}
return sum;
}
它的输出是
Array length 2
Sum of array is -2147483648
很明显,结果不是你所期望的。
如果把变量的类型设为sumlong long int那么结果就是正确的。
#include <stdio.h>
#include <limits.h>
#define LEN(a) (sizeof(a)/sizeof(a[0]))
long long int sum_array( const int * , size_t );
int main(void)
{
int a[] = { INT_MAX, 1 };
printf("Array length %zu\n",LEN(a));
long long int sum = sum_array( a, LEN( a ) );
printf("Sum of array is %lld\n",sum);
return 0;
}
long long int sum_array( const int *p , size_t n )
{
long long int sum = 0;
const int *q = p;
while ( q < p + n )
{
sum += *q++;
}
return sum;
}
程序输出是
Array length 2
Sum of array is 2147483648