This is the programm I wrote:
#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);
}
I don't unterstand why there is no & in the scanf function. The program works but I just don't unterstand why cause the & is missing. I'm guessing it has something to do with the pointer x however i'm not sure at all.
CodePudding user response:
You only need &
if you need to take the address of a value, that is, produce a pointer to that value. But x
is already a pointer, so there is no need for &
. It would be quite wrong to use &
in this case, because you'd end up with a pointer to a pointer!
There is also some pointer arithmetic going on: x (n-1)
advances the pointer by n-1
positions in memory, each position being sizeof(double)
bytes. If you view x
as an array, it's the same as &x[n-1]
; that is, the address of the n-1
th element in the array.
CodePudding user response:
x (n-1)
- this is pointer arithmetic (study the term).
The []
operator is specified with the guarantee that array[i]
(readable) is 100% equivalent to *((array) (i))
(unreadable).
In your case &x[n-1]
is the same as &*( (x) (n-1) )
. The &
and *
cancel each other out and what remains is x (n-1)
.
So we can unslopify the code using readable form like this: scanf("%lf", &x[n-1]);