【问题标题】:Array of arrays in C, where the arrays are of different lengthC中的数组数组,其中数组的长度不同
【发布时间】:2017-09-09 11:11:35
【问题描述】:

我知道你可以很容易地制作一个固定长度的矩阵:

double m[][2];

但是,我想要一个数据结构,它是一个数组,我在其中存储具有不同长度的 double 类型的数组。我该怎么做?

一个例子是:

arr1 = {1,2,3,4};
arr2 = {1,2};

【问题讨论】:

  • 一个解决方案是一个指针数组,其中每个指针指向子数组的第一个元素。当然,那它就不再是数组数组了。

标签: c arrays


【解决方案1】:

Jagged arrays 在 C 中通常表示为指向指针的指针数组:

double arr0[] = {4, 1, 7};
double arr1[] = {1, 2, 3, 4};
double arr2[] = {1, 2};
double *m[] = {arr0, arr1, arr2};

不幸的是,没有标准的语法来定义内部数组与外部指针数组“一致”。

请注意,现在无法找到每个内部数组的长度,因此您需要添加某种“标记”,或者单独存储长度:

#define SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
...
size_t len[] = { SIZE(arr0), SIZE(arr1), SIZE(arr2) };

【讨论】:

    【解决方案2】:

    可以使用指针数组来完成,即

    #include <stdio.h>
    
    int main(void) {
        double* x[2];
        double a[2] = {1.0, 2.0};
        double b[4] = {1.0, 2.0, 3.0, 4.0};
        x[0] = a;
        x[1] = b;
    
        printf("%f %f\n", x[0][1], x[1][3]);
        return 0;
    }
    

    要跟踪数组的大小(也就是数组中元素的数量),您可以考虑使用结构数组。喜欢:

    #include <stdio.h>
    
    struct z
    {
        unsigned int size;
        double* p;
    };
    
    int main(void) {
        int i, j;
        struct z x[2];
        double a[2] = {1.0, 2.0};
        double b[4] = {1.0, 2.0, 3.0, 4.0};
        x[0].p = a;
        x[0].size = sizeof a / sizeof(double);
        x[1].p = b;
        x[1].size = sizeof b / sizeof(double);
    
        for (i=0; i<2; ++i)
        {
            for (j=0; j<x[i].size; ++j)
            {
                printf("x[%d][%d] %f\n", i, j, x[i].p[j]);
            }
        }
        return 0;
    }
    

    输出:

    x[0][0] 1.000000
    x[0][1] 2.000000
    x[1][0] 1.000000
    x[1][1] 2.000000
    x[1][2] 3.000000
    x[1][3] 4.000000
    

    【讨论】:

      【解决方案3】:

      您可以通过创建一个指针数组来做到这一点。在这种情况下,锯齿状数组的元素不一定是连续存储的,并且必须以某种方式保持各个行的长度,以便可以使用锯齿状数组。

      如果数组类型允许,另一种选择是使用二维数组,将每行的大小存储在每行的第一个元素中。这可能会比指针数组使用更多的内存,但元素将连续存储在内存中。

      如果有一个值不能出现在数组中,可以使用标记值而不是显式存储行大小。即使数组的类型不允许存储大小值(例如,char[][]),也可以使用它。

      #include <stdio.h>
      #include <string.h>
      
      int main(void)
      {
          /* Jagged array using pointers */
          int array_1[] = { 1, 2, 3 };
          int array_2[] = { 5, 6 };
          int array_3[] = { 7, 8, 9, 10 };
      
          int *jagged_array_1[] = { array_1, array_2, array_3 };
          size_t array_sizes[] = { sizeof array_1 / sizeof *array_1,
                                   sizeof array_2 / sizeof *array_2,
                                   sizeof array_3 / sizeof *array_3 };
      
          for (size_t i = 0; i < 3; i++) {
              for (size_t j = 0; j < array_sizes[i]; j++) {
                  printf("%4d", jagged_array_1[i][j]);
              }
             putchar('\n');
          }
          putchar('\n');
      
          /* Using the first element to store sizes */
          int jagged_array_2[3][5] = { { 0 } };
      
          jagged_array_2[0][0] = sizeof array_1 / sizeof *array_1;
          memcpy(&jagged_array_2[0][1], array_1, sizeof array_1);
      
          jagged_array_2[1][0] = sizeof array_2 / sizeof *array_2;
          memcpy(&jagged_array_2[1][1], array_2, sizeof array_2);
      
          jagged_array_2[2][0] = sizeof array_3 / sizeof *array_3;
          memcpy(&jagged_array_2[2][1], array_3, sizeof array_3);
      
          for (int m = 0; m < 3; m++) {
              for (int n = 0; n < jagged_array_2[m][0]; n++) {
                  printf("%4d", jagged_array_2[m][n+1]);
              }
              putchar('\n');
          }
          putchar('\n');
      
          /* Using a sentinel element */
          int jagged_array_3[3][5] = { { 0 } };
      
          memcpy(jagged_array_3[0], array_1, sizeof array_1);
          jagged_array_3[0][sizeof array_1 / sizeof *array_1] = -1;
      
          memcpy(jagged_array_3[1], array_2, sizeof array_2);
          jagged_array_3[1][sizeof array_2 / sizeof *array_2] = -1;
      
          memcpy(jagged_array_3[2], array_3, sizeof array_3);
          jagged_array_3[2][sizeof array_3 / sizeof *array_3] = -1;
      
          for (size_t i = 0; i < 3; i++) {
              for (size_t j = 0; jagged_array_3[i][j] != -1; j++) {
                  printf("%4d", jagged_array_3[i][j]);
              }
              putchar('\n');
          }
          putchar('\n');
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-27
        • 2015-08-30
        • 2023-03-27
        • 2015-07-05
        • 1970-01-01
        • 2021-10-31
        • 2013-07-17
        • 2020-08-31
        • 1970-01-01
        相关资源
        最近更新 更多