#c #cpp
Нашел в поддерживаемом коде пример обращения к массиву n[a], где n - индекс, а a - массив. В простом примере выглядит как #includevoid main() { char hello[] = "hello"; puts(&0[hello]); } Вот эта строчка &0[hello] - что она значит?!
Ответы
Ответ 1
Стандарт C явно разрешает такую адресацию. 6.5.2.1 Array subscripting <...> A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). <...> Для чего это сделано сказать сложно. Скорее всего, хотели максимально упростить адресацию, соответственно, не стали городить сложных структур и определили операцию получения элемента массива как разыменование суммы. Поскольку «плюсик» коммутативен, как следствие желания упростить, получился такой курьёз. Я не могу придумать ни одного случая, когда был бы оправдан подобный «переворот» операндов.Ответ 2
насколько помню, это эквивалентно &hello[0]. просто кто-то выпендрился. это передача адреса 0-ого элемента массива (строки char) в функцию puts. далее по референсу: int puts ( const char * str ); Write string to stdout Writes the C string pointed by str to stdout and appends a newline character.Ответ 3
Просто адрес элемента вычисляется сложением индекса и адреса первого элемента. Си допускает подобный синтаксис. UPD: стёр фигню.Ответ 4
&0[hello] = &(*(0+hello)) = 0+hello (операция & обратна операции *) = hello Итого можно было написать не puts(&0[hello]); а просто puts(hello);Ответ 5
Все очень просто. Как мы знаем, компилятор видит hello[0] иначе. Он это интепритирует в *(hello + 0). Значит, такая запись &hello[0] будет выглядеть так &(*(hello + 0)). От перестановки слагаемых сумма не меняется, значит *(hello + 0) == *(0 + hello) и &(*(hello + 0)) == &(*(0 + hello)) Идем дальше *(hello + 0) == hello[0] и *(0 + hello) == 0[hello] &hello[0] == &(*(data+0)) и &0[hello] == &(*(0+data)) Ну и это адрес первого елемента то есть &0[hello] == hello
Комментариев нет:
Отправить комментарий