When you call scanf with the %d conversion specifier, the corresponding argument needs to be an expression that evaluates to the location of an integer object into which scanf will write the input value: 
scanf( "%d", location-expression );
location-expression can take on multiple forms.  To read into a single scalar object like x, you could use the expression &x.  
scanf( "%d", &x ); // &x evaluates to the location of x
Or, you could use a pointer variable that's initialized to point to x:
int *p = &x;      // p stores the address of x
scanf( "%d", p ); // scanf writes to x *through* p; p == &x
The expression p is equivalent to the expression &x in this case.  We don't use the & operator on p, because we want write to the address stored in p, not the address of p.  
When you write
scanf( "%d", x );
you're telling scanf to store input to the address stored in x.  There are several problems with that:
- xis not explicitly initialized to anything; its value is indeterminate;
- Because of 1, the odds that xcontains a value that corresponds to a valid pointer value (that is, the location of an object in your program) are extremely low;
- The type of the expression xisint, but%dexpects its corresponding argument to have typeint *- any modern compiler should yell at you.