【问题标题】:How to create a pointer which stores multiple arrays?如何创建一个存储多个数组的指针?
【发布时间】:2019-12-16 06:50:28
【问题描述】:

我对 C 语法很陌生,但这是我的问题:

我想创建一个存储多个浮点数组的指针。

据我所知,方法如下(?):

  • 我必须创建某种指针才能从其他函数访问这些数组。
  • 使用malloc 为其动态分配一些内存(用于数组)。
  • 我必须将它指向我正在创建的每个浮点数组。
int size = 100;

float *template[66]; //for 66 float arrays
malloc...
memset(&(template[i]), 0, size*sizeof(float));

需要一些关于代码序列的指导才能完成这项工作!

【问题讨论】:

  • 所以你想要 66 个浮点数组,每个数组的大小为 100?
  • 指针存储其他对象的地址,它们不存储数组。您可以拥有数组,并且您可以在内存的其他地方拥有保存这些数组地址的变量。或者这些数组的第一个元素的地址。清楚地记住这些概念将有助于找到要使用的正确语法。
  • 另外,请尝试为您自己的尝试创建一个minimal reproducible example,并描述您的问题。请花点时间刷新how to ask good questions,以及this question checklist
  • 您是希望 66 个浮点数组已经存在,还是只想在情况出现时才创建它们?
  • 为什么不float (*template)[100] = calloc(66, sizeof *template); - 完成。

标签: c arrays pointers malloc


【解决方案1】:

你可以随时获取一个对象的地址,你不需要指针变量来保存它们的地址。

到目前为止,根据您的要求,您可以为所有数组分配一块内存:

float (*p)[100] = malloc( sizeof(*p) * 66 );

它为您提供 66 个 100 个浮点数的块。然后就可以循环初始化了:

for (int i = 0; i < 66; ++i)
    for (int j = 0; j < 100; ++j)
         p[i][j] = 0.f;

如果一个函数需要第三个数组,你可以给它p[2](或&amp;p[2]),你不需要一些变量来存储p[2],因为你可以随时通过写p[2]得到它。你只需要存储p

【讨论】:

    【解决方案2】:

    如果所有大小都是已知的(在编译时),那么可以通过定义它们来创建这些数组。

    分别:

    float f00[100] =  {0., /* 98 more floats */ 99.};
      /* 64 more arrays */
    float f65[100] =  {0., /* 98 more floats */ 99.};
    
    float * arrays[66] = {
      f00,
      /* 64 more arrays */
      f65,
    }
    

    或一次性完成:

    float * arrays[66] = {
      (float[100]){0., /* 98 more floats */ 99.},
      /* 64 more arrays */
      (float[100]){0., /* 98 more floats */ 99.},
    }
    

    或全部使用二维数组,并由此导出单个数组指针:

    float array2d[66][100];
    
    float * f00 = array2d[0];
    /* 64 more float pointer here */
    float * f65 = array2d[65];
    

    或后者动态:

    float (*array2d)[66][100] = malloc(sizeof *array2d); 
    
    float * f00 = array2d[0];
    /* 64 more float pointer here */
    float * f65 = array2d[65];
    
    /* use it here */
    
    free(array2d);
    

    【讨论】:

      【解决方案3】:
      int i;
      /* this should really be const! */
      const int number_of_arrays = 66;
      const int size = 100;
      
      /* 
       * I would recommend NOT using 'template' as a variable name.
       * It's a reserved keyword in C++, so probably a good idea to avoid it!
       */
      
      float* myTemplate[number_of_arrays];
      
      for(i = 0; i < number_of_arrays; ++i)
      {
        /* allocate 100 floats */
        myTemplate[i] = (float*)malloc(size * sizeof(float));
      
        /* set all float values to zero */
        memset(myTemplate[i], 0, size * sizeof(float));
      }
      

      【讨论】:

      • 这仅在允许单个数组具有不同大小的情况下才有意义。否则它是不必要的低效。
      【解决方案4】:

      代码会是这样的:

      int size = 100;
      int number_of_arrays = 66;
      
      float *template[number_of_arrays ]; //for 66 float arrays
      for(int i = 0; i< number_of_arrays; ++i){
          template[i] = (float*)malloc(size * sizeof(float)); 
          memset((template[i]), 0, size*sizeof(float));
      }
      

      您必须使用 malloc 分配每个数组,并将返回的指针分配给“数组数组”的第 i 个元素

      memset 不需要“template[i]”的“&”(引用),因为“template[i]”已经是一个指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2010-10-06
        相关资源
        最近更新 更多