【问题标题】:Array of pointers pointing to 2-dimensional arrays指向二维数组的指针数组
【发布时间】:2020-03-06 20:43:20
【问题描述】:

我想创建一个指针数组,其中每个指针指向一个二维浮点数组。二维数组是这样定义的

float a[][2] = {{1,0.5},{2,0.5},{3,0.5},{4,0.5}};
float b[][2] = {{1,1},{5,1},{4,0.5},{3,0.5},{2,0.5},{8,1}};
float c[][2] = {{1,0.333},{1,0.333},{1,0.334}};

每一个都有不同数量的行,但总是 2 列。我还有一个函数,我将其中一个数组作为参数发送,并且需要在其中使用一些值。假设它是这样的(还有其他与我需要使用的其他值相关的东西,但它与问题不太相关)

void take_values(float arr[][2]){
  printf("%f ", arr[0][0]);
  printf("%f ", arr[0][1]);
}

在 main() 中,我一直在像这样在每个数组上使用该函数

take_values(a);
take_values(b);
take_values(c);

我想找到一种方法在每个数组上迭代该函数。我正在考虑制作一个引用每个二维数组的指针数组,但我不知道如何定义和使用它。

  1. 如何定义指向每个二维数组的指针数组?
  2. 如何使用该指针数组将二维数组作为 take_values 函数中的参数发送?
  3. 如何访问take_values 函数内的数组的特定值? / 我还需要在那里使用指针还是保持现在的样子?

【问题讨论】:

    标签: c arrays pointers multidimensional-array floating-point


    【解决方案1】:
    float (*ptrs[])[2] = {a, b, c};
    

    读作

            ptrs           -- ptrs
            ptrs[]         -- is an array of unknown size
          (*ptrs[])        -- of pointers
          (*ptrs[])[2]     -- to 2-element arrays
    float (*ptrs[])[2]     -- of float
    

    我们用指向abc的指针初始化它。

    您的函数定义如下所示:

    void take_values( float (**ptrs)[2] )
    {
      ...
    }
    
    int main( void )
    {
      float (*ptrs[])[2] = {a, b, c};
      ...
      take_values( ptrs );
    }
    

    您将索引到每个数组中

    ptrs[i][j][k] 
    

    maintake_values 中。

    我们如何到达那里:

    每个表达式 abc 都会“衰减”为类型 float (*)[2]1,因此每个数组都有一个指针可以声明为

    float (*pt1)[2] = a;
    float (*pt2)[2] = b;
    ...
    

    等等。我们只需声明一个指针数组来存储所有三个。

    你将索引到每个数组中

    ptrs[i][j][k]
    

    记住a[i]被定义为*(a + i),所以

    *a == *(a + 0) == a[0]
    

    这意味着

    (*ptrs[i])[k] == (*(ptrs[i] + 0))[k] == (ptrs[i][0])[k] == ptrs[i][0][k]
    

    因此,

    (*(ptrs[i] + j))[k] == (ptrs[i][j])[k] == ptrs[i][j][k]
    

    main 中,由于ptrsT 的数组,其中T 是“指向float 的2 元素数组的指针数组”,当您将其传递给函数时,它将“decay” 输入“指向T 的指针”,或“指向float 的2 元素数组的指针”。

    take_values 中,你正在处理一个指向指针的指针,所以

    (**ptrs)[i] == (*(*ptrs + 0))[i] == (*ptrs[0])[i] == (*(ptrs[0] + 0))[i] == (ptrs[0][0])[i]
    

    请注意,您需要一种方法来指示指针数组有多大,以及每个数组包含多少行。


    1. 除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式 类型为“T”的 N 元素数组将被转换(“衰减”)为“指向T”的指针类型的表达式,表达式的值将是数组第一个元素的地址.

    【讨论】:

      【解决方案2】:

      你可以这样做:

      float a[][2] = {{1,0.5},{2,0.5},{3,0.5},{4,0.5}};
      float b[][2] = {{1,1},{5,1},{4,0.5},{3,0.5},{2,0.5},{8,1}};
      float c[][2] = {{1,0.333},{1,0.333},{1,0.334}};
      
      float (*arr[])[][2] = {a, b, c};
      
      for (int i = 0; i < sizeof(arr) / sizeof(void *); i++) {
          take_values(arr[i]);
      }
      

      当然,现在您必须更改 arr 的定义以包含您拥有的更多二维数组(但无论如何您都必须这样做。)

      因此,例如,如果您添加了另一个名为 d 的二维数组,那么您将不得不更改定义:

      float (*arr[])[][2] = {a, b, c};
      

      到这里:

      float (*arr[])[][2] = {a, b, c, d};
      

      注意:请注意:

      i < sizeof(arr) / sizeof(void *);
      

      如果你曾经传递你的二维数组,它会衰减到一个指针,这将不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多