0

Я только начал изучать C++. Я смотрел на одном из примеров доступа к элементам массива и пример был следующим:Почему я не должен использовать стандартный цикл для доступа к динамическому массиву?

a[i][j]; 
*(&a[0] [0]+2*i+j); /* Base address */ 
*(*(a+i)+j); 

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

for(int row=0; row<i; row++){ 
    for(int col=0; col<j; col++){ 
     // Do something 
    } 
} 
+1

* I * смущает этот пример. Кто написал, что чудесно запутанный кусок ... кода? –

+0

Вы можете, пример, который вы показываете, был сделан кем-то в 90-х годах, который все еще думал, что способен разработать код, который никто не может читать и загадочный, делает вас лучшим программистом. Ваш собственный пример в порядке. –

+0

Откуда вы это взяли? Пожалуйста, прекратите учиться у него, что бы это ни было. : D – MindRoller

ответ

0

В этом примере перечислены 3 разных метода доступа к объекту в (предположительно) одном и том же индексе в многомерном массиве. Это то, что вы делаете внутри цикла. Так что либо сделать:

for(int row=0; row<i; row++){ 
    for(int col=0; col<j; col++){ 
    auto field = a[col][row]; 
    } 
} 

ИЛИ

for(int row=0; row<i; row++){ 
    for(int col=0; col<j; col++){ 
    auto field = *(*(a+col)+row); 
    } 
} 

ИЛИ

for(int row=0; row<i; row++){ 
    for(int col=0; col<j; col++){ 
    auto field = *(&a[0] [0]+2*col+row); 
    } 
} 
0

Когда дело доходит до доступа к любой 1-мерный массив, я вижу 2 стандартных варианта:

Один из них является тот, что ваш ответ содержит:

a[i] 

Второй один:

*(a + i) 

Однако, когда дело доходит до двух РАЗМЕРЫ я использовал бы ТОЛЬКО скобки:

a[i][j] 

Почему? Поскольку эквивалент выше выражения с использованием выражений указателей выглядит следующим образом:

*(*(a + i) + j) 

Довольно много пояснений, я думаю.

Также вы спрашивали о доступе к элементам массива. Поэтому я не знаю, что такое часть с циклами около ^^

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

  • Нет связанных вопросов^_^