2016-01-23 2 views
0

Я в настоящее время читает учебник по C++, который гласит следующее:Передача многомерных массивов в функции в C++

При прохождении массивов более высоких размерностей, только первое измерение может быть открыт в то время как другие должны быть известны во время компиляции.

Мне нужно дальнейшее объяснение по этому вопросу. При передаче 1D-массива (int a[]) некоторой функции f() массивы распадается на указатель int* a. Я предполагаю, что приведенное выше утверждение подразумевает, что 2D-массив, например, int a[][], распадается на int *a[] или он говорит, что только первое измерение может быть динамически распределено (что является бессмысленным). В частности, что означает «только первое измерение может быть открыто»? Это единственные два объяснения, которые я смог придумать.

ответ

1

Автор говорит, если массив int a[5][10] и вы хотите передать этот массив в некоторую функцию, то в объявлении функции вы пишете параметр принимающего этот массив как int x[][10] и даже этот параметр т.е. int x[][10] затухает в int (*x)[10]

Любом хороший способ передать 2D массив является:

template<typename T, int first,int second> 
void someFunction(T (&array)[first][second]) 
{....} 

Я предполагаю, что приведенное выше утверждение означает, что 2D массив для например Int А [] [] распадается на Int * а []

int a[x][y] распадается на int (*a)[y] т.е. a это указатель на массив y Интс, который отличается от int *a[y] что означает a это массив указателей y Int.

1

Если у вас есть двумерный массив, как, например

int a[M][N]; 

затем используется в выражениях, как, например, как в выражении аргумента, если соответствующий параметр функции, а не ссылка неявно преобразуется в указатель на его первый элемент int (*)[N].

Так, например, вы можете написать

int (*p)[N] = a; 

Вы можете себе это следующим образом.

Если у вас есть массив

T a[M}; 

, то она неявно преобразуется в выражениях с редкими исключениями в указатель на его первый элемент T *.

Если у вас есть двумерный массив

int a[M][N]; 

вы можете представить это следующим образом

typedef int T[N]; 
T a[M]; 

Так что указатель будет выглядеть

T *p = a; 

где тип T представляет собой одномерный массив int [N]