C 用指针算法求和数字
我被指派编写一个代码,该代码接受用户输入的数字,并提供其总和,特别是通过使用指针算法,即不允许数组订阅[I] 下面是我编写的代码,这些代码经过编译甚至运行。但它几乎总是给出输入数的和为0。我想把它修好,但没用。因此,我请求帮助,非常感谢任何帮助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<
#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(;pInx=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个空格。