LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Сам преподаю Си на втором курсе студентам, которые уже знают Паскаль — этим нет никаких проблем объяснить, что за зверь «указатель на массив» (который int (*p)[15])

Тут еще проблема в дурацком синтаксисе. Ну посудите сами:

uint8_t n1[][2] = {{1,2}, {3,4}, {5,6}, {99,88}};
uint8_t n2[][2] = {{7,8}, {9,10}, {11,12}, {99,88}};
uint8_t n3[][2] = {{13,14}, {15,16}, {17,18}, {99,88}};
    
// Надо сделать массив из указателей на двумерные массивы    
uint8_t (*ars[3])[2] = { n1, n2, n3}; // полная ерунда, нечитаемо. Как этот синтаксис объяснять студентам?
    
typeof( typeof(uint8_t [2]) *) ars2[3] = {n1, n2, n3}; // можно так
    
typeof( typeof(uint8_t [2]) *[3]) ars3 = {n1, n2, n3}; // можно еще так
    
typeof(uint8_t (*)[2]) ars4[3] = {n1, n2, n3}; // во, теперь норм!
этот метод через typeof(который является нестандартным расширением gcc) позволяет на мой взгляд сделать все значительно понятней, только с -ansi -pedantic он естественно не заработает. Можно можно делать через typedef-ы чтоб по-стандарту.

typedef uint8_t u8pair_t[2]
u8pair_t n1[] = {{1,2}, {3,4}, {5,6}, {99,88}};
u8pair_t n2[] = {{7,8}, {9,10}, {11,12}, {99,88}};
u8pair_t n3[] = {{13,14}, {15,16}, {17,18}, {99,88}};
u8pair_t *(ars[]) = {n1, n2, n3};

А, еще можно через структурки

typedef struct { uint8_t ar[4][2];} arr;
arr n1 = {{{1,2}, {3,4}, {5,6}, {99,88}}};
arr n2 = {{{7,8}, {9,10}, {11,12}, {99,88}}};
arr n3 = {{{13,14}, {15,16}, {17,18}, {99,88}}};
arr ars[] = {n1, n2, n3}; 

Исходная версия SZT, :

Сам преподаю Си на втором курсе студентам, которые уже знают Паскаль — этим нет никаких проблем объяснить, что за зверь «указатель на массив» (который int (*p)[15])

Тут еще проблема в дурацком синтаксисе. Ну посудите сами:

uint8_t n1[][2] = {{1,2}, {3,4}, {5,6}, {99,88}};
uint8_t n2[][2] = {{7,8}, {9,10}, {11,12}, {99,88}};
uint8_t n3[][2] = {{13,14}, {15,16}, {17,18}, {99,88}};
    
// Надо сделать массив из указателей на двумерные массивы    
uint8_t (*ars[3])[2] = { n1, n2, n3}; // полная ерунда, нечитаемо. Как этот синтаксис объяснять студентам?
    
typeof( typeof(uint8_t [2]) *) ars2[3] = {n1, n2, n3}; // можно так
    
typeof( typeof(uint8_t [2]) *[3]) ars3 = {n1, n2, n3}; // можно еще так
    
typeof(uint8_t (*)[2]) ars4[3] = {n1, n2, n3}; // во, теперь норм!
этот метод через typeof(который является нестандартным расширением gcc) позволяет на мой взгляд сделать все значительно понятней, только с -ansi -pedantic он естественно не заработает. Можно можно делать через typedef-ы чтоб по-стандарту.

u8pair_t n1[] = {{1,2}, {3,4}, {5,6}, {99,88}};
u8pair_t n2[] = {{7,8}, {9,10}, {11,12}, {99,88}};
u8pair_t n3[] = {{13,14}, {15,16}, {17,18}, {99,88}};
u8pair_t *(ars[]) = {n1, n2, n3};

А, еще можно через структурки

typedef struct { uint8_t ar[4][2];} arr;
arr n1 = {{{1,2}, {3,4}, {5,6}, {99,88}}};
arr n2 = {{{7,8}, {9,10}, {11,12}, {99,88}}};
arr n3 = {{{13,14}, {15,16}, {17,18}, {99,88}}};
arr ars[] = {n1, n2, n3};