Имейте в виду, что, хотя C
поддерживает нотации массивов, такие как 2D, 3D, ..., nD массивы, чтобы сделать работу с ними более естественной с точки зрения читаемости человеком. Но в памяти массивы фактически создаются как единый блок непрерывной памяти. Например, ваш массив:
const int L = 10;
...
int sites[L][L][L] = {0}; //(using {0} is an idiomatic way to init. arrays to all 0
организован в памяти как 10 * 10 * 10 последовательных (int) секций памяти, начиная с ячейки памяти, на которую указывает sites
.
* 1007. *
Из-за этого факта математика указателя становится довольно простой:
*(sites + 0) is equivalent to sites[0][0][0]
*(sites + 1) is equivalent to sites[0][0][1]
*(sites + 2) is equivalent to sites[0][0][2]
...
*(sites + 10) is equivalent to sites[0][1][0]
...
*(sites + 100) is equivalent to sites[1][0][0]
...
*(sites + 998) is equivalent to sites[9][9][8]
*(sites + 999) is equivalent to sites[9][9][9]
Схема между обозначением указателя и обозначением массива становится очень очевидной, так как число, добавляемое в начало массива, коррелирует с расположение индексов в нотации массива.
На основе этой базовой формы c вы можете получить способ использования математических указателей для представления многомерных массивов, в вашем случае затем, используя int *location;
, инициализированный для начало sites
может использоваться для отслеживания (или определения) того, какой элемент массива 3D
просматривается или изменяется.
Это может хорошо применяться к вашей конкретной проблеме c в этом отслеживании totalHops
, и принятие решений на основе значений вне диапазона 0 - 9
в любом направлении для x,y,z
может оказаться более сложным, чем принятие решения на основе обозначений, таких как *(sites + 400)
(согласно вашему описанию в OP).