Полагаю, я только что подтвердил правильность написанного. Следующие работы, как и ожидалось:
#include <stdio.h>
int main(int argc, char **argv) {
int shape1[5][3] = {1,0,0,
1,0,0,
1,0,0,
1,0,0,
1,0,0};
int shape2[5][3] = {0,0,0,
0,0,0,
0,1,1,
1,1,0,
0,1,0};
typedef int (*shapes_p)[3];
shapes_p shapes[2] = { shape1, shape2 };
shapes[0][1][0] = 5;
shapes[1][1][0] = 5;
printf("shape1[1][0] == %d\n", shape1[1][0]);
printf("shape2[1][0] == %d\n", shape2[1][0]);
}
Следует помнить, что тип shape1
и shape2
на самом деле:
int *shape1[5];
В вашей памяти есть 3 смежных массива по 5 дюймов каждый. Но фактическим типом является указатель на массив из 5-ти дюймов. Когда вы пишете:
shape1[1][2] = 1;
вы говорите компилятору проиндексировать второй массив int [5] и затем получить доступ к третьему элементу этого массива. На самом деле компилятор выполняет арифметику указателей на указанный базовый тип, в данном случае int [5]. Вы можете сделать то же самое с помощью следующего кода:
int *p = shapes1[0];
p+7 = 1; // same as shape1[1][2] = 1;
Так что, если вы хотите, чтобы массив указателей указывал на int * [5], вы должны сделать:
typedef int (*shapes_p)[5];
shapes_p shapes[2];