C 有人能给我解释一下吗

C 有人能给我解释一下吗,c,pointers,C,Pointers,对于n=3和a={1,2,3},b={4,5,6}应该计算1*4+2*5+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 pr

对于
n=3
a={1,2,3},b={4,5,6}
应该计算
1*4+2*5+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;
}
#包括
#包括
无效花旗(整数x,整数n)
{
对于(int i=1;i当您执行以下操作时:

size_t size = 10;
int* x = calloc(size, sizeof(int));
你会得到一个数组
x
,其中有10个项目,索引为0..9,而不是1..10。这里用来让它非常清楚所请求的内容,而不是执行神秘或迟钝的乘法

因此,要迭代:

for (int i = 0; i < size; ++i) {
  x[i] ...
}
for(int i=0;i
由于假设数组为1..N而不是0..N(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;
    }
#包括
#包括
无效citire(整数*x,大小)
{
对于(int i=0;i
在不属于指针的地方使用指针。在C中,将指针传递给单个值意味着“这是可变的”,但不更改这些值,因此不需要也不建议使用指针


尝试使用
size\t
作为“大小”类型。这是整个C中使用的,它是一个无符号值,因为负索引或数组长度没有任何意义。

C中的数组以0开始,而不是1,因此循环
(int i=1;i尽管您声明了
p
作为指针,但实际上并没有将其作为指针使用。因为
produs
函数返回一个
int
,那么该值将分配给p(指针毕竟是整数类型)。如果以后尝试将其用作指针,则会出现未定义的行为,因为它不会指向任何有意义的内容。提问时,请使用标题来传达可观察到的问题。“不理解”的含义太广泛。不理解具体指的是什么?编译器是否向您显示了一些警告?“它为什么工作?”不是很有用。你认为它应该表现不同吗?你认为它会崩溃吗?如果一个程序包含未定义的行为,它仍然是获得预期结果的完全有效的行为。