Как работают 2d-массивы в C при использовании typedef?

#c #multidimensional-array #declaration #typedef

Вопрос:

Слайд-лекция вопрос, по которому мне нужна помощь: Слайд-лекция вопрос, по которому мне нужна помощь:

Я пропустил свою сегодняшнюю лекцию, поэтому понятия не имею, что происходит с этим вопросом на слайдах лекции. Мой инстинкт подсказывает мне, что это будет матрица C. и N x M (строка x col), но я не слишком уверен. Любая помощь будет признательна

Ответ №1:

double X_t[N] обозначает тип массива с N элементами типа double.

X_t A[M]; представляет собой объявление массива с M элементами, имеющими тип double[N] .

Таким образом, это заявление эквивалентно

 double A[M][N];
 

Вот демонстрационная программа.

 #include <stdio.h>

int main(void) 
{
    enum { M = 2, N = 5 };
    typedef double X_t[N];
    
    printf( "sizeof( X_t ) = %zun", sizeof( X_t ) );
    
    putchar( 'n' );
    
    X_t A[M];
    
    printf( "sizeof( A ) = %zun", sizeof( A ) );
    printf( "sizeof( A[0] ) = %zun", sizeof( A[0] ) );
    printf( "sizeof( A ) / sizeof( A[0] ) = %zun", sizeof( A ) / sizeof( A[0] ) );
    

    return 0;
}
 

Вывод программы является

 sizeof( X_t ) = 40

sizeof( A ) = 80
sizeof( A[0] ) = 40
sizeof( A ) / sizeof( A[0] ) = 2
 

Таким образом, видно, что массив A содержит два элемента с размером 40 в байтах, эквивалентным N * sizeof( double ) .

Ответ №2:

Это b, и множество двойников MxN.

 typedef double X_t[N];
 

определяется X_t как массив N двойников.

Когда вы создаете из них массив, каждый X_t представляет собой строку. Так

 X_t A[M];
 

создает M такие строки.

Ответ №3:

Вот как нужно это обдумать:

 X_t A[M];
 

A является массивом M-элементов чего — то-это что-то есть X_t . Так что сразу же это исключает c в качестве возможного ответа.

Теперь вы посмотрите на определение X_t . На данный момент притворись, что typedef этого нет:

 double X_t[N];
 

Это объявляется X_t как массив из N элементов double . Когда мы добавляем typedef ключевое слово:

 typedef double X_t[N];
 

это означает X_t , что это псевдоним для типа «N-элементный массив double «. Итак, если A является массивом M-элементов X_t и X_t является псевдонимом для «массива N-элементов double «, то типом A является «массив M-элементов массива N-элементов double » или «массив MxN double «. Это равносильно написанию

 double A[M][N];
 

Поскольку [] оператор является постфиксным, каждый раз, когда вы заменяете массив typedef его «голым» эквивалентом, вы помещаете размер замещенного массива справа. Предположим, что существуют следующие типы:

 typedef double A_type[M];  // A_type is an array of double
typedef A_type B_type[N];  // B_type is an array of A_type
typedef B_type C_type[O];  // C_type is an array of B_type
 

и это заявление

 C_type x;
 

Мы хотим знать, каков фактический тип x , поэтому мы делаем следующее:

  1. x является объектом типа C_type . C_type является именем typedef для типа «массив O-элементов B_type «, поэтому мы заменяем C_type на B_type [O] . Поскольку [] оператор является постфиксным, [O] он переходит в крайнюю правую часть декларатора:
     B_type x[O];
     
  2. x представляет собой массив O-элементов типа B_type . B_type является именем typedef для типа «N-элементный массив A_type «. Как и на предыдущем шаге, мы B_type заменяем A_type [N] и помещаем [N] в крайнюю правую часть декларатора:
     A_type x[O][N];
     
  3. x представляет собой массив O-элементов из N-элементных массивов A_type . A_type является именем typedef для типа «массив M-элементов double «. Мы заменяем A_type на double [M] , и снова [M] переходим к самой правой части декларатора, оставляя нас с:
     double x[O][N][M];
     

Ответ №4:

typedef-зарезервированное ключевое слово в языках программирования C и C . Он используется для создания дополнительного имени (псевдонима) для другого типа данных, но не создает новый тип, за исключением неясного случая квалифицированного typedef типа массива, где квалификаторы typedef переносятся в тип элемента массива.

 typedef double X_t[N]; 
 
X_t A[M];
 

это было бы похоже на написание

 double A[M][N];