2014-11-27 3 views
-2

Будет ли всегда считаться следующее утверждение независимо от платформы, и есть ли у вас ссылка на эту гарантию?Переносимость итерации по массиву с помощью указателя

const unsigned SIZE = 10; 
Foo array[SIZE]; 
Foo* ptr = array; 
for (int i = 0; i < SIZE; ++i) { 
    assert(&array[i] == (ptr + i)); 
} 

Edit: Для выяснения вопроса, для цикла можно использовать для перебора элементов массива следующими способами:

for (int i = 0; i < array_size; ++i) { 
    DoSomethingWith(array[i]); 
} 


Foo* end = array + array_size; 
for (Foo* ptr = array; ptr < end; ++ptr) { 
    DoSomethingWith(*ptr); 
} 

Я понимаю, что не все архитектуры использовать тот же порядок при обращении к памяти, поэтому мне было интересно узнать о переносимости метода указателя. Если бы вы искали этот сайт для использования «итерации массива с указателем» или ошибочно включали endian в поиск, ничего существенного не появилось.

+1

Да, это всегда будет правдой. Вам не удалось найти ссылку самостоятельно? Где вы пытались посмотреть (есть ответы SO со ссылками на окончательные проекты C, C++ 03 и C++ 11), и как вы застряли ...? Downvote для «этот вопрос не показывает никаких исследований». –

ответ

3

C++ стандарт, раздел § 5.2.2 [expr.sub]:

Выражение E1 [E2] идентична (по определению) до * ((E1) + (Е2))

Так array[i] идентичен *(array + i)

с ptr == array также *(ptr + i)

Так, &array[i] является &(*(ptr + i)), который (ptr + i)


Примечание:

Это при условии, что вы не переопределить Foo::operator &: если это так, то результат &(*(ptr + i)) не может быть (ptr + i).

+0

@ Jarod42: true, примечание добавлено. – quantdev

Смежные вопросы