Назначение 2d параметра указателя массива переменной указателя локального массива - PullRequest
2 голосов
/ 06 мая 2020

Я немного запутался в том, как назначить параметр указателя 2d массива локальной переменной указателя 2d массива. Проверьте код ниже.

#define N   5
#define M   6

void print(int (*arr)[M][N]) {

    int *localArr[M][N];

    localArr = arr;  //error C3863: array type 'int *[6][5]' is not assignable
    //localArr[0][0] =1; and so on.
}

int main()
{

    int Array1[M][N];
    print(&Array1);         
}

Ответы [ 3 ]

1 голос
/ 06 мая 2020

локальное объявление должно быть таким,

 int (*localArr)[M][N]; //pointer to an MxN array
 //int * localArr[m][N];//An MxN array of pointer to int
0 голосов
/ 06 мая 2020

Если мы изменим размеры, чтобы было легче разместить:

#define M 2
#define N 3

Тогда графически переменная arr будет примерно такой:

+-----+      +--------+--------+--------+--------+--------+--------+
| arr | ---> | [0][0] | [0][1] | [0][2] | [1][0] | [1][1] | [1][2] |
+-----+      +--------+--------+--------+--------+--------+--------+

arr is указатель. Он указывает на массив массивов, где каждый элемент - это int.

Это означает, что вы можете разыменовать arr, чтобы получить то, на что он указывает, а затем использовать индексацию массива для получения int value:

int value = (*arr)[0][1];

Теперь, если мы возьмем localArr, это будет больше похоже на

+----------------+----------------+----------------+----------------+----------------+----------------+
| localArr[0][0] | localArr[0][1] | localArr[0][2] | localArr[1][0] | localArr[1][1] | localArr[1][2] |
+----------------+----------------+----------------+----------------+----------------+----------------+

localArr - это массив массивов, где каждый элемент - int * .

Итак, вам понадобится int *, чтобы получить единственный элемент:

int *pointer = localArr[0][1];
0 голосов
/ 06 мая 2020

Чего ты хочешь достичь? Если вы просто хотите распечатать свой 2-мерный массив, почему бы вам не использовать этот подход?

void print(int localArr[M][N]) {

    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            cout << localArr[i][j];
        }
    }
}

Если есть некоторые ограничения, тогда Nithee sh прав!

...