Передача 2D-массива в качестве аргумента - PullRequest
4 голосов
/ 11 июля 2011

В этом примере:

int a[2][2]={{1,2},{3,4}};
int *p=a[0];
cout<<p;
cout<<&a[0][0];

Оба дают одинаковый вывод. Тогда почему я не могу вызвать функцию (скажем, забавно), как это, и перебрать массив:

fun(a[0]);

fun(int *p)
{
cout<<p[1][1];
}

Ответы [ 3 ]

3 голосов
/ 11 июля 2011
fun(a[0]); //this looks OK

void fun(int *p) // this is OK if you add return type'
^^^^
{
   cout<<p[1][1]; //NOT OK!  You can't have 2 indices on an `int*`
   cout << p[1]; // OK, will print a[0][1]
}
2 голосов
/ 11 июля 2011

Чтобы ответить на ваш вопрос: когда пишешь:

p = a[0];

a[0] (теперь 0-й элемент в массив 1D) на самом деле распадается на указатель p. Таким образом, оба не совсем одного типа, хотя они, кажется, есть. Когда вы пишете:

fun(a[0]);

Вы фактически передаете 0 элемент массива, который теперь является одномерным массивом. Таким образом, вы можете получить одним из следующих способов:

fun(int *p); // decay to pointer to 1D array
fun(int (&a)[2]); // receive array by reference

В обоих случаях fun() теперь имеет одномерный массив.

Чтобы упростить задачу, передайте ссылку на массив:

void fun(int (&p)[2][2])
{
  cout<<p[1][1];  // ok !
}

Использование:

fun(a); // not a[0]
0 голосов
/ 11 июля 2011

Вы не можете cout<<p[1][1];, потому что p - это int * - одномерный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...