C 用指针算法求和数字

C 用指针算法求和数字,c,pointers,C,Pointers,我被指派编写一个代码,该代码接受用户输入的数字,并提供其总和,特别是通过使用指针算法,即不允许数组订阅[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<

我被指派编写一个代码,该代码接受用户输入的数字,并提供其总和,特别是通过使用指针算法,即不允许数组订阅[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;
   }
#包括
#定义n5
整数和数组(常数整数*p,整数n)
{
整数和,a[N];
总和=0;

对于(p=&a[0];p注意,您在
main
sum\u array
中都声明了数组
inta[N]
。它们在不同的范围内,因此它们是不同的数组(并且
sum\u array
中的数组从不初始化,因此读取它会调用未定义的行为)

正确的方法是将数组与其使用的长度一起传递:

以下是一个固定版本:

#include<stdio.h>
#define N 5

int sum_array( const int *a, int n)    // a points to a array of at least n elements
{
 int  sum = 0;                         // initialize at definition time

  for(const int *p=a; p<&a[n]; p++)    // have the pointer p take all values from a
  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(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}

注意,您在
main
sum\u array
中都声明了数组
int a[N]
。它们在不同的作用域中,因此它们是不同的数组(并且
sum\u array
中的数组从未初始化,因此读取它会调用未定义的行为)

正确的方法是将数组与其使用的长度一起传递:

以下是一个固定版本:

#include<stdio.h>
#define N 5

int sum_array( const int *a, int n)    // a points to a array of at least n elements
{
 int  sum = 0;                         // initialize at definition time

  for(const int *p=a; p<&a[n]; p++)    // have the pointer p take all values from a
  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(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}
int和数组(常数int*p,int n)
{
整数和=0,i=0;
对于(i=0;iint-sum_数组(常数int*p,int-n)
{
整数和=0,i=0;
对于(i=0;ix=sum_数组(i,N);
i
是循环的迭代器,因此循环完成后,它指向数组后的第一个位置

您应该传递原始数组,而不是
x=sum_数组(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;
}
int和数组(常数int*p,int n)
{
整数和=0;
int*end=&p[n];//数组后的第一个元素。
for(;pIn
x=sum_数组(i,N);
i
是循环的迭代器,因此循环完成后,它指向数组后的第一个位置

您应该传递原始数组,而不是
x=sum_数组(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;
}
int和数组(常数int*p,int n)
{
整数和=0;
int*end=&p[n];//数组后的第一个元素。

对于(;p一般来说,编程时,代码应尽可能简单,同时保持完整

程序标准表明,在将数字应用于数字之和后,无需保留数字,因此在建议的代码中,输入数字只保留足够长的时间以应用于数字之和,然后将其丢弃

建议的守则如下:

#include <stdio.h>    // scanf(), printf(), fprintf(), stderr
#include <stdlib.h>   // exit(), EXIT_FAILURE

#define N 5


int main( void )
{
    int num = 0;
    int sum = 0;

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

    for(size_t i=0; i<N; i++)
    {
        if( scanf("%d", &num) != 1 )
        {
            fprintf( stderr, "failed to read number\n" );
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful
        sum += num;
    }

    printf( "the sum  is %d\n", sum );

    return 0;
}
  • 干净地编译
  • 执行所需的功能
  • 保持非常简单
  • 正确检查;并处理任何错误
  • 现在建议的守则是:

    #include <stdio.h>    // scanf(), printf(), fprintf(), stderr
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    #define N 5
    
    
    int main( void )
    {
        int num = 0;
        int sum = 0;
    
        printf("Enter %d Numbers: ", N);
    
        for(size_t i=0; i<N; i++)
        {
            if( scanf("%d", &num) != 1 )
            {
                fprintf( stderr, "failed to read number\n" );
                exit( EXIT_FAILURE );
            }
    
            // implied else, scanf successful
            sum += num;
        }
    
        printf( "the sum  is %d\n", sum );
    
        return 0;
    }
    
    #包括//scanf()、printf()、fprintf()、stderr
    #包括//退出(),退出失败
    #定义n5
    内部主(空)
    {
    int num=0;
    整数和=0;
    printf(“输入%d个数字:”,N);
    
    对于(size_t i=0;i一般来说,编程时,代码应尽可能简单,同时保持完整

    程序标准表明,在将数字应用于数字之和后,无需保留数字,因此在建议的代码中,输入数字只保留足够长的时间以应用于数字之和,然后将其丢弃

    建议的守则如下:

    #include <stdio.h>    // scanf(), printf(), fprintf(), stderr
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    #define N 5
    
    
    int main( void )
    {
        int num = 0;
        int sum = 0;
    
        printf("Enter %d Numbers: ", N);
    
        for(size_t i=0; i<N; i++)
        {
            if( scanf("%d", &num) != 1 )
            {
                fprintf( stderr, "failed to read number\n" );
                exit( EXIT_FAILURE );
            }
    
            // implied else, scanf successful
            sum += num;
        }
    
        printf( "the sum  is %d\n", sum );
    
        return 0;
    }
    
  • 干净地编译
  • 执行所需的功能
  • 保持非常简单
  • 正确检查;并处理任何错误
  • 现在建议的守则是:

    #include <stdio.h>    // scanf(), printf(), fprintf(), stderr
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    #define N 5
    
    
    int main( void )
    {
        int num = 0;
        int sum = 0;
    
        printf("Enter %d Numbers: ", N);
    
        for(size_t i=0; i<N; i++)
        {
            if( scanf("%d", &num) != 1 )
            {
                fprintf( stderr, "failed to read number\n" );
                exit( EXIT_FAILURE );
            }
    
            // implied else, scanf successful
            sum += num;
        }
    
        printf( "the sum  is %d\n", sum );
    
        return 0;
    }
    
    #包括//scanf()、printf()、fprintf()、stderr
    #包括//退出(),退出失败
    #定义n5
    内部主(空)
    {
    int num=0;
    整数和=0;
    printf(“输入%d个数字:”,N);
    
    对于(size_t i=0;i在读取输入的循环之后,
    i
    指向何处?将
    a
    直接传递到
    sum\u数组
    。那么
    a
    sum\u数组
    函数中有什么用途?它根本不需要初始化。你不是说a[]不允许使用语法?为什么要使用它?为了便于阅读和理解,请一致地缩进代码。缩进在每个左大括号“{”之后。缩进在每个右大括号“}之前“。建议每个缩进级别为4个空格。在读取输入的循环之后,
    i
    指向何处?将
    a
    直接传递到
    sum\u数组
    。那么
    a
    sum\u数组
    函数中有什么用途?它根本不需要初始化。你不是说a[]不允许使用语法?为什么要使用它?为了便于阅读和理解,请一致地缩进代码。缩进在每个开始大括号“{”之后。缩进在每个结束大括号“}”之前。建议每个缩进级别为4个空格。