Редактировать: я держу свой первоначальный ответ ниже, так как считаю, что людям необходимо понять, как массивы на самом деле передаются функциям и как они размещаются в памяти, но при дальнейшем рассмотрении я думаю, что есть простой и правильный способ получить то, что вы хотите сделать.
Инкапсулирует массив в структуре, например,
typedef struct ArrayHolderStruct{
int array[2][3][4];
} ArrayHolder
//...
//scope 1
ArrayHolder thingy;
thingy.array[0] = something;
//other initialization.
F( &thingy );
//...
//scope 2
ArrayHolder *pa;
void F ( ArrayHolder *p ){
pa = p;
p->array[0][1][2] = 42;
}
//Call F first to set pa.
void G(){
pa->array[0][1][2] = 6 * 9; // if pa = &thingy, thingy will be modified.
}
Структура позволит вам сохранить информацию о компоновке инкапсулированного массива, и вам не придется беспокоиться о мерзкой индексной арифметике.
----- СТАРЫЙ ОТВЕТ -----
Передача ссылки на массив бесполезна, если только вы не хотите изменить размер или компоновку массива (что в любом случае вы не можете сделать с массивами статического размера). Вы получите ссылку (или указатель) на элементы массива, даже если вы передадите массив по значению. То есть, если вы объявите свою функцию:
void f ( int a[2][3][4] ){
a[0][1][2] = 42;
}
и вызывать его как f( array )
при выходе из f
, array[0][2][2]
будет установлен на 42, даже если вы не передали "ссылку" на array
в функцию.
Если вы хотите сохранить указатель на массив для последующего использования в функции библиотеки и т. Д., Вы можете сделать что-то вроде:
//scope 2
int * pa;
void f ( int a[2][3][4] ){
pa = &a[0][0][0];
}
В этот момент становится сложно - вы должны знать, как pa выкладывается (выкладывается?) В память. Я думаю, что C стандартизировал 'мажорный порядок строк', поэтому массив должен быть расположен в памяти как:
a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][1][0] ... a[0][2][3] a[1][0][0] a[1][0][1]... a[1][2][3]
Итак, чтобы получить элемент с индексом [n][j][k]
, вам нужно сделать что-то вроде:
pa[n * 12 + j * 4 + k] = something;
По сути, умножьте каждый индекс на количество элементов, на которые может ссылаться индекс этого порядка, например, каждый индекс k
указывает ровно на один элемент с фиксированным индексом j
и n
, каждый индекс j
может указывать на 4 элемента с фиксированным индексом n
, а каждый индекс n
может указывать на один из 12 (потому что 12 = 3 * 4) элементов.
Как я уже сказал, это сложно. См. Статьи в Википедии о структурах массивов данных и мажорном порядке , чтобы лучше понять, как устроены эти вещи.