передавая массив внутри функции - PullRequest
2 голосов
/ 29 августа 2011
int f(int b[][3]);

int main()
{
    int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    f(a);
    printf("%d\n", a[2][1]);
}

int f(int b[][3])
{
    ++b;
    b[1][1] = 1;
}

3x3 => 9 элементов, содержащихся в двумерном массиве a. Когда это передано, тогда b будет содержать базовый адрес a. Если предположить, что базовый адрес равен 1000, то ++b как это сделать в 3 точках, а не в 9? Мы делаем типизацию, когда переменная a передается в b[][3] как только три элемента?

Как b[1][1] соответствует адресу 8, а не 5?

Мы не можем увеличивать или уменьшать массив, поскольку массив является указателем const, но как они увеличивают ++b как массив?

Ответы [ 3 ]

5 голосов
/ 29 августа 2011

Заголовок функции

 int f(int b[][3])

- не более чем запутанный способ записи (и точно эквивалентен to)

 int f(int (*b)[3])

b - это "указатель на массив из трех элементов int".Когда вы увеличиваете параметр b, вы настраиваете его так, чтобы он указывал на следующий массив из трех элементов int - теперь он указывает на {4,5,6}.Затем b[1] индексирует еще раз и дает вам массив {7,8,9} и, наконец, b[1][1] дает вам один элемент этого массива, а именно 8.

0 голосов
/ 29 августа 2011

C многомерные массивы действительно линейны, за исключением того, что есть синтаксический сахар для правильного выполнения арифметики.

то же самое с b[][3], он исключает одномерный массив и неявно переводит b[i][j] --> b[3*i+j]

++b работает следующим образом: (++b)[i][j] = ORIGINAL_b[i+1][j]. Итак, в вашем случае вы получаете доступ к ORIGINAL_b[1+1][1] = ORIGINAL_b[2*3+1] = ORIGINAL_b[7] (8-й элемент)

Примечание: это резко контрастирует с динамической версией malloc (в **b, b - массив указателей)

0 голосов
/ 29 августа 2011

Как b [1] [1] соответствует адресу 8, а не адресу 5?

Это ожидаемое поведение:

int f(int b[][3])
{
    //at this point b[0][0] is 1, b[1][1] is 5

    ++b;
    //now b[0][0] is 4, b[1][1] is 8

    b[1][1]=1;
}

Указатель увеличился, чтобы указать на следующий слот памяти, который является вторым слотом массива a.В основном:

b -> a[0]
++b -> a[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...