【问题标题】:sum of the array using pointers in c使用c中的指针对数组求和
【发布时间】:2019-09-13 14:29:30
【问题描述】:

使用以下代码使用指针查找数组元素的总和。 我不知道为什么程序没有在数组末尾结束!!

#include <stdio.h>

#define LEN(a) (int) (sizeof(a)/sizeof(a[0])) 

int sum_array(int * , int);

int main(void){

    int a[] = {1,2,3,4,5,6,7,8,9};

    printf("Array length %d\n",LEN(a));

    int sum = sum_array(a,LEN(a));

    printf("Sum of array is %d\n",sum);
    return 0;
}
int sum_array( int * p , int n){

    int sum = 0;

    while ( p < p+n ){
        printf("Sum of array is %d\n",sum);
        sum += *p++;
    }

    return sum;
}
`

解决了,谢谢!!

int sum_array( int * a , int n){
    int sum = 0, *p=a;
    while ( p < a+n ){
        printf("Sum of array is %d\n",sum);
        sum += *p++;
    }
    return sum;


获取地址边界错误!!

【问题讨论】:

  • 您在循环的每次迭代中增加p,使p + n 的结果成为移动目标。

标签: c loops for-loop pointers while-loop


【解决方案1】:

对于非负的np &lt; p + n 怎么可能是 1?

如果您想以这种方式绑定循环,则需要将p 的初始值存储在某处。

为了更轻松的生活,请使用for (int i = 0; i &lt; n; ++i) 代替while (p &lt; p + n),并且在您掌握了正确的基础知识后,如果您必须并且反对任何专业建议,请采用华丽的版本。

【讨论】:

  • 我想说没有比for (int i = 0; i &lt; n; ++i) 更炫的版本了。这就是最能给其他程序员留下深刻印象的地方!
【解决方案2】:

问题在于,在循环的条件下,您使用的是在循环内更改的指针。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2018-01-04
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多