这是我写的程序:
#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有关,但我一点也不确定。
2条答案
按热度按时间z9ju0rcb1#
只有当你需要获取一个值的地址时才需要
&
,也就是说,产生一个指向该值的指针。但是x
已经是一个指针了,所以不需要&
。在这种情况下使用&
是非常错误的,因为你最终得到的是一个指向指针的指针!还有一些指针运算正在进行:
x+(n-1)
将指针在内存中向前移动n-1
个位置,每个位置为sizeof(double)
个字节。也就是数组中第n-1
个元素的地址。m1m5dgzv2#
x+(n-1)
-这是 * 指针算术 *(学习该术语)。指定
[]
运算子时,必须保证array[i]
(可读取)100%相等*((array) + (i))
(不可读取)。在你的例子中,
&x[n-1]
和&*( (x) + (n-1) )
是一样的,&
和*
相互抵消,剩下的是x + (n-1)
。因此,我们可以使用如下可读形式来简化代码:
scanf("%lf", &x[n-1]);