使用 typedef 时,二维数组如何在 C 中工作?
How do 2d arrays work in C when using typedef?
我需要帮助的讲座幻灯片问题:
我错过了今天的讲座,所以我不知道讲座幻灯片中的这个问题是怎么回事。我的直觉告诉我应该是 C. 和 N x M 矩阵(行 x 列),但我不太确定。
感谢任何帮助
它是 b,MxN 双精度数组。
typedef double X_t[N];
将 X_t
定义为 N
个双精度数组。
当你将这些排列成一个数组时,每个 X_t
都是一行。所以
X_t A[M];
创建 M
行。
double X_t[N]
表示具有 N
个双精度类型元素的数组类型。
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 ) = %zu\n", sizeof( X_t ) );
putchar( '\n' );
X_t A[M];
printf( "sizeof( A ) = %zu\n", sizeof( A ) );
printf( "sizeof( A[0] ) = %zu\n", sizeof( A[0] ) );
printf( "sizeof( A ) / sizeof( A[0] ) = %zu\n", 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 )
.
以下是思考的方法:
X_t A[M];
A
是 something 的 M 元素数组 - something 是 X_t
。所以马上排除 c 作为可能的答案。
现在你看看X_t
的定义。目前,假设 typedef
不存在:
double X_t[N];
这将 X_t
声明为 double
的 N 元素数组。当我们添加 typedef
关键字时:
typedef double X_t[N];
这意味着 X_t
是类型“double
的 N 元素数组”的 别名 。所以,如果A
是X_t
的M元数组,而X_t
是“double
的N元数组”的别名,那么[=的类型19=] 是“double
的 N 元素数组的 M 元素数组”,或“double
的 MxN 数组”。相当于写
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
是类型 "O-element array of B_type
" 的 typedef 名称,因此我们将 C_type
替换为 B_type [O]
。由于 []
运算符是后缀,因此 [O]
位于声明符的最右侧:B_type x[O];
x
是类型 B_type
的 O 元素数组。 B_type
是类型 "N-element array of A_type
" 的类型定义名称。与上一步一样,我们将 B_type
替换为 A_type [N]
并将 [N]
放在声明符的最右侧:A_type x[O][N];
x
是A_type
的N元数组的O元数组。 A_type
是类型 "M-element array of double
" 的类型定义名称。我们将 A_type
替换为 double [M]
,[M]
再次转到声明符的最右侧,留下:double x[O][N][M];
typedef 是编程语言 C 和 C++ 中的保留关键字。它用于为另一种数据类型创建一个附加名称(别名),但不创建新类型,除非在数组类型的限定 typedef 的模糊情况下,其中 typedef 限定符被传输到数组元素类型。
typedef double X_t[N];
X_t A[M];
这将类似于写作
double A[M][N];
我需要帮助的讲座幻灯片问题:
我错过了今天的讲座,所以我不知道讲座幻灯片中的这个问题是怎么回事。我的直觉告诉我应该是 C. 和 N x M 矩阵(行 x 列),但我不太确定。 感谢任何帮助
它是 b,MxN 双精度数组。
typedef double X_t[N];
将 X_t
定义为 N
个双精度数组。
当你将这些排列成一个数组时,每个 X_t
都是一行。所以
X_t A[M];
创建 M
行。
double X_t[N]
表示具有 N
个双精度类型元素的数组类型。
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 ) = %zu\n", sizeof( X_t ) );
putchar( '\n' );
X_t A[M];
printf( "sizeof( A ) = %zu\n", sizeof( A ) );
printf( "sizeof( A[0] ) = %zu\n", sizeof( A[0] ) );
printf( "sizeof( A ) / sizeof( A[0] ) = %zu\n", 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 )
.
以下是思考的方法:
X_t A[M];
A
是 something 的 M 元素数组 - something 是 X_t
。所以马上排除 c 作为可能的答案。
现在你看看X_t
的定义。目前,假设 typedef
不存在:
double X_t[N];
这将 X_t
声明为 double
的 N 元素数组。当我们添加 typedef
关键字时:
typedef double X_t[N];
这意味着 X_t
是类型“double
的 N 元素数组”的 别名 。所以,如果A
是X_t
的M元数组,而X_t
是“double
的N元数组”的别名,那么[=的类型19=] 是“double
的 N 元素数组的 M 元素数组”,或“double
的 MxN 数组”。相当于写
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
是类型 "O-element array ofB_type
" 的 typedef 名称,因此我们将C_type
替换为B_type [O]
。由于[]
运算符是后缀,因此[O]
位于声明符的最右侧:B_type x[O];
x
是类型B_type
的 O 元素数组。B_type
是类型 "N-element array ofA_type
" 的类型定义名称。与上一步一样,我们将B_type
替换为A_type [N]
并将[N]
放在声明符的最右侧:A_type x[O][N];
x
是A_type
的N元数组的O元数组。A_type
是类型 "M-element array ofdouble
" 的类型定义名称。我们将A_type
替换为double [M]
,[M]
再次转到声明符的最右侧,留下:double x[O][N][M];
typedef 是编程语言 C 和 C++ 中的保留关键字。它用于为另一种数据类型创建一个附加名称(别名),但不创建新类型,除非在数组类型的限定 typedef 的模糊情况下,其中 typedef 限定符被传输到数组元素类型。
typedef double X_t[N];
X_t A[M];
这将类似于写作
double A[M][N];