Lvalue: Те выражения, которым можно присваивать, называются lvalue в C, C++ и многих других языках (это сокращение от «left value», т. е. слева от знака равенства). Остальные выражения называются rvalue. Имена переменных очевидным образом являются lvalue, но не только они. Выражения:
a[i + 2]
some_struct.some_field
*ptr
*(ptr + 3)
— это все тоже Lvalue.
Другими словами, Lvalue - это нечто, чему можно присвоить. Т. е. это некое фиксированное место в памяти, куда можно что-то положить.
Rvalue: это выражения, которым присваивать нельзя. Нельзя написать так:
int a=5;
10=a; // Ошибка
Здесь во второй строке 10 - это Rvalue. И такому выражению (выражению 10) невозможно ничего присвоить.