#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
, поэтому мы делаем следующее:
x
является объектом типаC_type
.C_type
является именем typedef для типа «массив O-элементовB_type
«, поэтому мы заменяемC_type
наB_type [O]
. Поскольку[]
оператор является постфиксным,[O]
он переходит в крайнюю правую часть декларатора:B_type x[O];
x
представляет собой массив O-элементов типаB_type
.B_type
является именем typedef для типа «N-элементный массивA_type
«. Как и на предыдущем шаге, мыB_type
заменяемA_type [N]
и помещаем[N]
в крайнюю правую часть декларатора:A_type x[O][N];
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];