c - 使用指针算术求和数字
问题描述
我被分配编写一个代码,该代码将数字作为用户的输入并提供它的总和,特别是通过使用指针算术,即不允许数组下标 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;
}
解决方案
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;
}
推荐阅读
- javascript - Vanilla Javascript 中带有按钮的暗模式
- vb.net - 如何通过插入另一个图像来修改图像?
- logback - Micronaut 根据环境配置记录器追加器
- php - 如何通过 HTML 表单发送 PHP 数组(使用输入标签)
- ssl - 带有自签名证书的 GRPC ssl
- python - 从 df.isnull().sum() 中删除非零字段
- objective-c - 只允许在函数定义中使用不带类型的参数列表
- javascript - 如何将过滤器应用于嵌套数组?
- system-verilog - 忽略covergroup的一个实例的coverage bin
- angular - 使用 JhiDataUtils.openFile() 打开文件时如何设置文件名和窗口名