2015-02-05 2 views
1

Может указатель на многомерный массив в C должен быть записан как:Указатель на многомерный массив в C?

double *array; 

Где array является п на п матрицу?

И затем я могу получить доступ к элементу в строке i, колонка j, по array[i][j]?

Или есть такая вещь, как двойной указатель?

+0

Здесь * есть * такая вещь, как '**', но это совсем не то же самое, что и '[] []'. – EOF

+0

Вам нужно объявить как 'array [rows * columns]' (или выделить память для) и индексировать '[row * columns + col]' –

+0

Указатель - это указатель. Указатель на что-либо в C представлен таким же образом, поэтому, если вы хотите, вы можете их отбросить. Но это настоятельно не рекомендуется.Многомерные массивы обычно представлены как указатели на другие указатели. –

ответ

5

Может указатель на многомерный массив в C должна быть записана как:

double *array; 

Да.

Скажите, что у вас есть M x N массив. Вы можете использовать:

double* array = malloc(M*N*sizeof(*array)); 

Затем, вы можете получить доступ к элементам с помощью:

size_t getArrayIndex(size_t m, size_t n, size_t M) 
{ 
    return (m*M+n); 
} 

double getArrayElement(double* array, size_t m, size_t n, size_t M) 
{ 
    return array[getArrayIndex(m, n, M)]; 
} 
+1

@ user3746892 См. Этот вопрос http://stackoverflow.com/questions/14015556/how-to-map-the-indexes-of-a-matrix-to-a-1-dimensional-array-c, хотя он имеет C++ ответ может помочь вам лучше понять этот ответ. – Cyberguille

-1

Может указатель на многомерный массив в C должен быть записан как:

double *array; 

Это может быть что-то, что используется для представления n массив, передавая его функции! Массив C тогда отображается только указателем на его первый элемент. Как эти элементы организованы внутри, зависит от вас; убедитесь, что вы не используете индексы, которые также находятся вне массива.

Или есть такая вещь, как двойной указатель?

Конечно; double ***ndim_array совершенно в порядке. Однако вы также можете использовать многомерные массивы, такие как double [][][].

(Спасибо всем авторов в комментариях!)

+0

Указатель - это * не * массив, а '**' ** - NOT ** a '[] []'. – EOF

+0

@EOF: да, вы правы, конечно, с «указателем не является массивом»; Я думаю, что я достаточно корректен в отношении 'double [] []' на самом деле нужно читать как «массив массивов», т.е. указатель на указатель. –

+0

№ Это многомерный массив. Они действительно, действительно разные. – EOF

0

double * является указателем на double. Он также является указателем на элемент массива double.

Чтобы сделать то, что вы хотите:

double bla[23][42];   // array of arrays, type is double [23][42] 
double (*p)[23][42] = &bla; // pointer to an object of type double [23][42] 
0

сделать указатель многомерного массива array[i][j], где я есть число строк и J есть число столбцов, которые можно сделать double (*ptr)[j], который говорит, что PTR указатель вдвое массив из j элементов. то вы можете назначить ptr=array;