Или они оба равны? ptr — указатель на массив структур.
UPD: Спасибо всем за ответ. Извините, я неправильно написал синтаксис. То, что я пытаюсь сравнить, это (ptr + i)->Func()
против (&ptr[i])->Func()
, Я запутался с &
оператор, как предполагается, чтобы вернуть адрес переменной. Разве это не приводит к еще одной операции захвата этого адреса?
Вы, наверное, имеете в виду &ptr[i]->Func()
в противном случае ваши выражения не имеют идентичной функциональности.
Согласно стандарту C ++ добавление значения типа указателя к значению целочисленного типа приводит к получению указателя того же типа, что и оригинал, со смещением, равным значению целочисленного типа. То же значение получается путем взятия адреса ptr[offset]
так что оба они идентичны. Более того, порядок добавления не имеет значения, поэтому все приведенные ниже выражения делают одно и то же и должны генерировать идентичные исполняемые коды:
&ptr[i]
(ptr+i)
(i+ptr)
&(i[ptr]) // <<== Don't do this!
Последний пункт есть только в качестве любопытства. Не используйте эту конструкцию в коде за пределами программирования.
(ptr + i)->Func()
эквивалентно ptr[i].Func()
,
И из-за приоритета оператора, &ptr[i].Func()
эквивалентно &(ptr[i].Func())
то есть он принимает адрес возвращаемого значения Func()
,
Нет никакой разницы. ptr[i]
гарантируется стандартом, чтобы быть полностью эквивалентным *(ptr+i)
, Первый обычно легче читать.
Я предполагаю, что структура или класс имеет функцию Func.
Таким образом, доступ к функции по адресу такой же, как доступ к полю.
На мой взгляд это просто адрес арифметических различий.
Так? оба они равны.