【问题标题】:How do 2d arrays work in C when using typedef?使用 typedef 时,二维数组如何在 C 中工作?
【发布时间】:2021-11-14 09:05:33
【问题描述】:

我需要帮助的演讲幻灯片问题:

我今天错过了我的讲座,所以我不知道讲座幻灯片中的这个问题是怎么回事。我的直觉告诉我这将是 C. 和 N x M 矩阵(行 x col),但我不太确定。 任何帮助表示赞赏

【问题讨论】:

    标签: c multidimensional-array declaration typedef


    【解决方案1】:

    它是 b 和 MxN 的双精度数组。

    typedef double X_t[N];
    

    X_t 定义为N 双精度数组。

    当您创建一个数组时,每个X_t 是一行。所以

    X_t A[M];
    

    创建M 行。

    【讨论】:

      【解决方案2】:

      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 )

      【讨论】:

        【解决方案3】:

        以下是思考的方法:

        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元素数组”的别名,那么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 的实际类型是什么,所以我们执行以下操作:

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

          【讨论】:

            猜你喜欢
            • 2013-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-12
            • 1970-01-01
            • 2021-07-06
            • 2020-01-18
            • 1970-01-01
            相关资源
            最近更新 更多