For starters in C this expression
a<=20?b=30:c=30
is equivalent to
( a<=20?b=30:c ) = 30
and the compiler will issue an error because the left operand of the assignment is not lvalue.
You have to write
a <= 20 ? b = 30 : ( c = 30 )
or for symmetry
a <= 20 ? ( b = 30 ) : ( c = 30 )
What you mean is the following
*( a <= 20 ? &b : &c ) = 30;
It is a trick of getting a reference to an object in the C meaning that is indirectly through a pointer to an object. The pointer itself is rvalue but dereferencing it you get lvalue of the pointed object.
In C++ you could write simply
( a <= 20 ? b : c ) = 30;
because in this case the operator returns lvalue.
There is a difference between C and C++ in the definition of the grammar of the conditional operator.
In C it is defined like (6.5.15 Conditional operator)
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
while in C++ (C++ 14, 5.16 Conditional operator)
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
So in C++ the original expression that is not compiled by the C compiler is valid
a <= 20 ? b = 30 : c = 30