C语言 为什么扫描函数中没有&?

np8igboo  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(175)

这是我写的程序:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

void meanVariance(double* x, int n, double* mean, double* variance);
double* scanVector(int length);

void meanVariance(double* x, int n, double* mean, double* variance){
    double sum = 0;

    for (int i = 0; i < n; i++){
        sum += x[i];
    }

    *mean = sum / ((double)n);

    sum = 0;

    for (int i = 0; i < n; i++)
    {
        double sq = x[i] - *mean;
        sum += sq * sq;
    }

    if (n != 1)
    {
        *variance = sum / ((double)n );
    }
    else
    {
        *variance = 1;
    }

}

int main() {
    double *x = malloc(sizeof(double)), mean = 0, variance = 0;
    int n = 0;
    do {
        n++;
        x = realloc(x, sizeof(double) * (n));
        printf("Type in the %d- Number 

: ", n);
        scanf("%lf", (x+(n-1)));
        meanVariance(x, n, &mean, &variance);
        printf("Mittelwert: %f\n", mean);
        printf("Varianz: %f\n", variance);
    } while(*(x+(n-1)) != 0);
    free(x);
}

我不明白为什么scanf函数中没有&。程序可以运行,但我不明白为什么缺少&。我猜它与指针x有关,但我一点也不确定。

z9ju0rcb

z9ju0rcb1#

只有当你需要获取一个值的地址时才需要&,也就是说,产生一个指向该值的指针。但是x已经是一个指针了,所以不需要&。在这种情况下使用&是非常错误的,因为你最终得到的是一个指向指针的指针!
还有一些指针运算正在进行:x+(n-1)将指针在内存中向前移动n-1个位置,每个位置为sizeof(double)个字节。也就是数组中第n-1个元素的地址。

m1m5dgzv

m1m5dgzv2#

x+(n-1)-这是 * 指针算术 *(学习该术语)。
指定[]运算子时,必须保证array[i](可读取)100%相等*((array) + (i))(不可读取)。
在你的例子中,&x[n-1]&*( (x) + (n-1) )是一样的,&*相互抵消,剩下的是x + (n-1)
因此,我们可以使用如下可读形式来简化代码:scanf("%lf", &x[n-1]);

相关问题