char *s = ...;
char *t = ...;
...
t[i] = s[i];
t[i]
- это lvalue , выражение, которое относится к объекту. Чрезмерно упрощая бит [*], если он появляется в левой части назначения (как здесь), он ссылается на конкретный объект char
, и назначение обновляет значение этого объекта. s[i]
аналогично, но оно появляется справа от назначения, поэтому оно возвращает значение объекта.
Это по сути то же самое, что и:
int x;
int y;
y = x;
x
и y
являются именами объектов, и они оба lvalues. y
в левой части относится к объекту. x
справа возвращает значение, сохраненное в объекте.
[*] Упрощение заключается в том, что существуют иные контексты, кроме левой части присваивания, в которых lvalue ссылается на объект, а не дает его значение.
Здесь немного больше рассказывается о том, как определяется оператор []
(см. Раздел 6 comp.lang.c FAQ ) о взаимосвязях между массивами и указателями), но в этом В этом случае все, что вам действительно нужно знать, это то, что s[i]
и t[i]
являются именами объектов.
Подробные сведения приведены в стандарте C, N1570, черновик , раздел 6.3.2.1.