【发布时间】:2021-11-14 09:05:33
【问题描述】:
【问题讨论】:
标签: c multidimensional-array declaration typedef
【问题讨论】:
标签: c multidimensional-array declaration typedef
它是 b 和 MxN 的双精度数组。
typedef double X_t[N];
将X_t 定义为N 双精度数组。
当您创建一个数组时,每个X_t 是一行。所以
X_t A[M];
创建M 行。
【讨论】:
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 ) = %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元素数组”的别名,那么A的类型就是“M元素数组double 的 N 元素数组”,或“double 的 MxN 数组”。相当于写
double A[M][N];
由于[] 运算符是后缀,因此无论何时将数组typedef 替换为其“裸”等效项,都将替换后的数组大小放在右侧。假设以下 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 是类型“B_type 的 O 元素数组”的 typedef 名称,因此我们将 C_type 替换为 B_type [O]。由于[] 运算符是后缀,[O] 位于声明符的最右侧:B_type x[O];
x 是 B_type 类型的 O 元素数组。 B_type 是“A_type 的 N 元素数组”类型的 typedef 名称。与上一步一样,我们将B_type替换为A_type [N],并将[N]放在声明符的最右侧:A_type x[O][N];
x 是 A_type 的 N 元素数组的 O 元素数组。 A_type 是类型“double 的 M 元素数组”的 typedef 名称。我们将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];
【讨论】: