#cpp #c #массивы #указатели
На этот вопрос уже даны ответы здесь: Как работает &0[hello]? (5 ответов) Закрыт 2 года назад. Не совсем понятно: int i; int array[anySize]; Почему запись arr[i] эквивалентна i[arr]?
Ответы
Ответ 1
Потому как все равно "за сценой" все это преобразуется в указатель с помощью арифметики arr+i, а как известно, a+b == b+a :)Ответ 2
arr это просто указатель на первый элемент массива (arr == &arr[0]) То есть arr[i] == *(&arr[0] + i). Это просто синтаксический сахар, который и так работает. Я думаю вы поторопились, в книге по которой вы изучаете язык просто обязано быть об этом.Ответ 3
Потому что стандарт. Смотрите пункт 5.2.1: A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “array of T” or “pointer to T” and the other shall have unscoped enumeration or integral type. The result is of type “T.” The type “T” shall be a completely-defined object type.64 The expression E1[E2] is identical (by definition) to *((E1)+(E2)) [ Note: see 5.3 and 5.7 for details of * and + and 8.3.4 for details of arrays. — end note ], except that in the case of an array operand, the result is an lvalue if that operand is an lvalue and an xvalue otherwise. Гугл-переводчик: Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должно иметь тип «массив Т» или «указатель на Т», а другой должен иметь неперечисленное перечисление или интегральный тип. Результат имеет тип «T». Тип «T» должен быть полностью определенным типом объекта. Выражение E1 [E2] идентично (по определению) к * ((E1) + (E2)) [Примечание: См. 5.3 и 5.7 для деталей * и + и 8.3.4 для получения подробной информации о массивах. - end note], за исключением того, что в случае операнда массива результат равен lvalue, если этот операнд является lvalue и xvalue в противном случае.
Комментариев нет:
Отправить комментарий