0

Есть массив:

int a[5][5];

И есть функция:

int foo(int d[][5])
{
    return 1;
}

Почему нельзя передать в функцию двумерный массив как указатель на указатель? И почему нужно обязательно указывать количество столбцов?т.е int d[ ][ ] нельзя так передать?

Harry
  • 221,325

3 Answers3

2

Потому что указатель на указатель - это совсем другая структура (другое размещение элементов в памяти). Это массив указателей, где каждый указывает на еще один одномерный массив где-то в другом месте памяти.

Двумерный же массив - это единый блок памяти, и компилятор должен знать, где заканчивается одна строка и начинается вторая. И если это ему не указать, как вы предлагаете - то как найти нужное место в этом блоке?...

Harry
  • 221,325
  • то есть адрес двумерного массива никак нельзя получить?точнее присвоить какому нибудь указателю – Barracudach Apr 07 '20 at 13:30
  • и если,например есть двойной указатель 'arr' типа int,почему нельзя обращаться к элементам массива n[6][5] так ((arr+3)+3).Ведь arr+3 это есть arr+sizeof(type)*3 и в памяти получается все так же упорядочено как и с двумерным массивом – Barracudach Apr 07 '20 at 13:34
  • Адрес получить можно, но это не адрес массива указателей, а адрес одной "макаронины" в памяти, которая просто делится на строки. 2. Можно. Только чему у вас равен size(type), если вы передаете int arr[][]? Без указания размера строки?
  • – Harry Apr 07 '20 at 13:40
  • Harry,а как получить тогда адрес начала этой "макаронины"?Я пишу int a[5][5]; int *b= a; И у меня выдает ошибку преобразования.Но ведь 'a' имеет тип указателя,не так ли,и из за чего тогда ошибка? – Barracudach Apr 07 '20 at 14:51
  • @Whitehorse, int *b = &a[0]; –  Apr 07 '20 at 15:20
  • ヒミコ ,а почему нельзя как я написал? 'a' имеет же тип указателя – Barracudach Apr 07 '20 at 15:30
  • a имеет тип int[5][5]. Попробуйте int * b = &a[0][0]; – Harry Apr 07 '20 at 16:43