Я пытаюсь сделать 2d массив, передать его в функцию, а затем обновить модифицированный массив в основном - PullRequest
1 голос
/ 07 сентября 2011

Компилятор показывает:

Warning: passing argument 1 of 'fun' from incompatible
pointer type; note: expected 'int ()[5]' but argument
is of type 'int (*)[5][5]'

Код:

#include<stdio.h>

void fun(int * b[][5])
{

    int x=11,y=90;
    printf("here");
    *b[1][3] = x;
    *b[3][1] = y;
    *b[2][2] = x + ++y;
}

int main()
{

    int a[5][5];
    a[1][3] = 12;
    a[3][1] = 145;
    fun(&a);

    printf("%d %d %d",a[1][3],a[3][1],a[2][2]);
}

Ответы [ 2 ]

3 голосов
/ 07 сентября 2011

Вам не нужна звездочка в параметрах вашей функции, и вам не нужно разыменовывать массив b в вашей функции.Массивы передаются по ссылке (поэтому избавьтесь от амперсанда в foo (& a) также), поскольку C рассматривает их как указатели на первый элемент последовательности.

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

Ваш код должен выглядеть примерно так:

void fun(int b[][5]) // can also be (int (*b)[5]), i.e. array of 5 pointers
{
    int x=11,y=90;
    b[1][3] = x;
    b[3][1] = y;
    b[2][2] = x + ++y;
}

int main()
{ // ...
    fun(a);
  // ...
}
2 голосов
/ 07 сентября 2011
 int a[5][5]; //is an 2d int array

Когда массивы передаются в функцию, на самом деле передается указатель на первый элемент массива.

Таким образом, вызов функции fun() с fun(a) фактически передаст указатель на первый элемент a, в данном случае это массив типа int размером 5. Функция fun() получит указатель на массив типа int размером 5, то есть int (*b)[5]. Обратите внимание, что int *b[5] - это не то же самое, и это массив размера 5, содержащий указатели int.

Ваша fun функция может иметь:

void fun(int b[][5])

или

void fun(int (*b)[5])

Первый способ сделать это гласит, что функция получит двумерный массив целых чисел, но поскольку мы знаем, что в действительности функция будет отправлена ​​функции, это указатель на первый элемент массива a, компилятор тихо скомпилирует функцию, как если бы параметр был указателем, так как это указатель, который она получит.

Второй способ сделать это явно показывает, какой тип он получит, указатель на массив размером 5.

...