I’d like to know if, in the following declaration, p is an lvalue, i.e. is p an expression in this declaration ? (if the answer is “yes”, it’s an lvalue because p changes the value of the object located at &p with the value &n).
unsigned char *p = &n;
C says (emphasis mine) for initialization of a scalar:
and the constraints of the assignment operators says the left operand must be a (modifiable) lvalue.
And for the terminology, a declaration is not an expression nor a statement but the initializer can be an expression.