Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Как работает &0[hello]?

#c #cpp


Нашел в поддерживаемом коде пример обращения к массиву n[a], где n - индекс, а a
- массив. В простом примере выглядит как
#include 

void 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

Комментариев нет:

Отправить комментарий