Согласно c стандарту 2011 :
За исключением случаев, когда это операнд оператора sizeof, оператор _Alignof, унарный оператор &, оператор ++,- оператор или левый операнд.оператор или оператор присваивания, lvalue, у которого нет типа массива, преобразуется в значение, хранящееся в назначенном объекте (и больше не является lvalue);это называется преобразованием lvalue.
...
Имя lvalue происходит от выражения присваивания E1 = E2, в котором левый операнд E1 должен быть (изменяемый) lvalue.Возможно, его лучше рассматривать как представление объекта '' значение локатора ''.
, поэтому выражение, состоящее из модифицируемой переменной указателя, может определенно действовать как lvalue, так же как указатель на указатель и так далее:
int i = 0;
int *p;
p = &i; // 'p' is lvalue
int *q = p; // 'p' is rvalue, lvalue conversion
*p = i; // '*p' is lvalue
i = *p; // '*p' is rvalue, lvalue conversion
int **pp;
pp = &p; // 'pp' is lvalue
int **qq = pp; // 'pp' is rvalue, lvalue conversion
int ***ppp;
ppp = &pp; // 'ppp' is lvalue
int ***qqq = ppp; // 'ppp' is rvalue, lvalue conversion