basic points :-
int i; ---- i is the variable of data type of int
int *p; ---- p is the variable of data type of int *
in your question
x is the variable of data type of node
&x is the address of the variable of data type of node
x.val=3 ===> x is a structure variable ===> x.val is a member of x and it's data type is int===> x.val = 5
&x.val=4 ===> By precedence rules (& (x.val) ) = 4 ==> you are using the address of variable x.val as l-value
all we know that, memory addresses can't use as l-value, therefore above statement generates compilation error