Есть ли разница между (ptr + i) -> Func () и & amp; ptr [i] .Func ()

Или они оба равны? ptr — указатель на массив структур.

UPD: Спасибо всем за ответ. Извините, я неправильно написал синтаксис. То, что я пытаюсь сравнить, это (ptr + i)->Func() против (&ptr[i])->Func(), Я запутался с & оператор, как предполагается, чтобы вернуть адрес переменной. Разве это не приводит к еще одной операции захвата этого адреса?

2

Решение

Вы, наверное, имеете в виду &ptr[i]->Func()в противном случае ваши выражения не имеют идентичной функциональности.

Согласно стандарту C ++ добавление значения типа указателя к значению целочисленного типа приводит к получению указателя того же типа, что и оригинал, со смещением, равным значению целочисленного типа. То же значение получается путем взятия адреса ptr[offset]так что оба они идентичны. Более того, порядок добавления не имеет значения, поэтому все приведенные ниже выражения делают одно и то же и должны генерировать идентичные исполняемые коды:

&ptr[i]
(ptr+i)
(i+ptr)
&(i[ptr]) // <<== Don't do this!

Последний пункт есть только в качестве любопытства. Не используйте эту конструкцию в коде за пределами программирования.

1

Другие решения

(ptr + i)->Func() эквивалентно ptr[i].Func(),

И из-за приоритета оператора, &ptr[i].Func() эквивалентно &(ptr[i].Func())то есть он принимает адрес возвращаемого значения Func(),

8

Нет никакой разницы. ptr[i] гарантируется стандартом, чтобы быть полностью эквивалентным *(ptr+i), Первый обычно легче читать.

2

Я предполагаю, что структура или класс имеет функцию Func.
Таким образом, доступ к функции по адресу такой же, как доступ к полю.
На мой взгляд это просто адрес арифметических различий.
Так? оба они равны.

1
По вопросам рекламы [email protected]