Q:

Why dereference a reference in C? Using & next to *

I looked at this and this and this and this and more.
Question is: 
A basic C Programming MOOC on EdX is showing how to access a member of a struct within a function, when the struct was passed by pointer. Why in the world are they using & next to *???
They show: scanf("%lf", &(*studptr).aveGrade);
Why not just use studptr.aveGrade in scanf? 
(Leaving aside the separate question, "why use scanf at all")
(Was asked for complete example)
void readStudent(struct student *studptr) {
    print("\nEnter a new student record: \n");
    printf("First name: ");
    scanf("%s", (*studptr).firstName);
    printf("Last name: ");
    scanf("%s", (*studptr).lastName);
    printf("Birth year: ");
    scanf("%d", &(*studptr).birthYear);
    printf("Average grade: ");
    scanf("%lf", &(*studptr).aveGrade);
}

A:

In the fragment:
scanf("%lf", &(*studptr).aveGrade);

the & operator applies as if there were parentheses:
scanf("%lf", &((*studptr).aveGrade));

There's no good reason to use (*ptr).member in preference to ptr->member; indeed, explicit indirection notation is more verbose, and doubly so when there are chains of operations:
(*(*(*ptr).ptrmember).altptr).member

vs:
ptr->ptrmember->altptr->member

So, the code should be:
scanf("%lf", &studptr->aveGrade);

Yes, the two are 'equivalent', but the arrow notation is idiomatic C and the other is not.

A:

Because & doesn't refer to (*stupdtr), it refers to (*studptr).aveGrade. The . operator has higher precedence.

A:

The two symbols are referring to different things.
The & is taking the address of the aveGrade member.
The * is deferencing the studptr to get a structure.

If it were up to me, I'd write it using the Arrow operator for pointers-to-structures:
scanf("%lf", &studptr->aveGrade);

If you want parens to clarify:
scanf("%lf", &(studptr->aveGrade) );

