开发者社区> 问答> 正文

可以请给我解释一下

对于n=3和a={1,2,3},b={4,5,6}应该计算14+25+3*6。我不明白为什么会这样,因为p是一个指针,并且p=produs(a,b,n)意味着p的地址变成了produs返回的值。

#include <stdio.h>
#include <conio.h>
void citire(int *x,int *n)
{
    for(int i=1; i<=*n; i++)
        scanf("%d",&x[i]);
}

int produs(int *a,int*b,int n)
{
    int produs=0;
    for(int i=1;i<=n;i++)
        produs=a[i]*b[i]+produs;
    return produs;
}

int main()
{
    int n;
    int*p;
    scanf("%d",&n);

    int *a=(int*)malloc(n*sizeof(int));
    int *b=(int*)malloc(n*sizeof(int));
    citire(a,&n);
    citire(b,&n);
    p=produs(a,b,n);
    printf("%d",p);

    return 0;
}

展开
收起
kun坤 2019-11-29 11:29:09 355 0
1 条回答
写回答
取消 提交回答
  • 当您这样做时:
    
    size_t size = 10;
    int* x = calloc(size, sizeof(int));
    您将得到一个数组,x其中包含10个项目,索引为0..9,而不是1..10。此处calloc用于使请求内容更加清晰明了,而不是进行可能是神秘的或钝的乘法。
    
    因此,要迭代:
    
    for (int i = 0; i < size; ++i) {
      x[i] ...
    }
    由于假设数组是1..N而不是0 ..(N-1),所以您的代码中存在许多偏离一的错误。
    
    将所有内容放在一起并清理代码将产生:
    
        #include <stdio.h>
        #include <stdlib.h>
    
        void citire(int *x, size_t s)
        {
            for(int i=0; i < s; i++)
                scanf("%d", &x[i]);
        }
    
        int produs(int *a, int* b, size_t s)
        {
            int produs = 0;
    
            for(int i = 0; i < s; i++)
                produs = a[i] * b[i] + produs;
    
            return produs;
        }
    
        int main()
        {
            int n;
            scanf("%d",&n);
    
            int* a = calloc(n, sizeof(int));
            int* b = calloc(n, sizeof(int));
    
            citire(a, n);
            citire(b, n);
    
            // produs() returns int, not int*
            int p = produs(a,b,n);
            printf("%d", p);
    
            return 0;
        }
    您在指针不属于的地方使用指针。在C语言中,将指针传递给单个值的意思是“这是可变的”,但是您无需更改这些值,因此不需要或不建议使用指针。
    
    尝试将其size_t用作“事物大小”类型。这就是整个C语言中使用的值,并且它是一个无符号值,因为负索引或数组长度没有任何意义。
    
    
    2019-11-29 11:29:23
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《0代码搭应用》 立即下载
不止代码 立即下载
低代码开发师(初级)实战教程 立即下载