首页 > 解决方案 > 使用指针算术求和数字

问题描述

我被分配编写一个代码,该代码将数字作为用户的输入并提供它的总和,特别是通过使用指针算术,即不允许数组下标 a[i]。

下面是我编写的代码,它被编译甚至运行。但几乎总是它将输入数字的总和设为 0。我试图修复它,但无济于事。因此,我正在寻求帮助,非常感谢任何帮助。

#include<stdio.h>
#define N 5

int sum_array( const int *p, int n)
{
 int  sum, a[N];
 sum = 0;

  for(p=&a[0]; p<&a[N]; p++)
  sum += *p;

 return sum;
 }


 int main()
{
  int a[N], *i,x;

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
   scanf("%d", i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(i,N);                       
  printf("the sum  is %d\n", x);

  return 0;
   }

标签: cpointers

解决方案


Inx= sum_array(i,N); i是循环的迭代器,因此循环完成后,它指向数组之后的第一个位置。

您应该改为传递原始数组x= sum_array(a,N);

在 sum 函数中,您只需丢弃传递的指针并将其替换为本地a[].

int sum_array( const int *p, int n)
{
  int sum = 0;
  int *end = &p[n]; // first element after the array.

  for(; p<end; p++) // just use p because you don't need the reference to the start of the array
  {
    sum += *p;
  }
  return sum;
}

但正如您所说,不允许使用数组表示法,您可以按如下方式更改它

#include "stdio.h"

#define N 5

int sum_array( const int *p, int n)
{
  int sum = 0;
  const int *end = p+n; // first element after the array.

  for(; p<end; p++) 
  {
    sum += *p;
  }

  return sum;
}

 int main()
{
  int *a, *i, x;

  a = malloc(N * sizeof(*a));

  if (a == NULL)   
    exit(-1);

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
  {
    scanf("%d", i);
  }


   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}

推荐阅读