使用 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];

Asomething 的 M 元素数组 - somethingX_t。所以马上排除 c 作为可能的答案。

现在你看看X_t的定义。目前,假设 typedef 不存在:

double X_t[N];

这将 X_t 声明为 double 的 N 元素数组。当我们添加 typedef 关键字时:

typedef double X_t[N];

这意味着 X_t 是类型“double 的 N 元素数组”的 别名 。所以,如果AX_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 的实际类型是什么,所以我们执行以下操作:

  1. x 是类型 C_type 的对象。 C_type 是类型 "O-element array of B_type" 的 typedef 名称,因此我们将 C_type 替换为 B_type [O]。由于 [] 运算符是后缀,因此 [O] 位于声明符的最右侧:
    B_type x[O];
    
  2. x 是类型 B_type 的 O 元素数组。 B_type 是类型 "N-element array of A_type" 的类型定义名称。与上一步一样,我们将 B_type 替换为 A_type [N] 并将 [N] 放在声明符的最右侧:
    A_type x[O][N];
    
  3. xA_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];