通过指针传递二维数组

时间:2010-08-18 17:52:06

标签: c arrays pointers

如何将m矩阵传递给foo()?如果我不被允许更改foo()的代码或原型?

void foo(float **pm)
{
    int i,j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            printf("%f\n", pm[i][j]);

}

int main ()
{
    float m[4][4];

    int i,j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            m[i][j] = i+j;

    foo(???m???);
}

9 个答案:

答案 0 :(得分:15)

如果你坚持上述foo的声明,即

void foo(float **pm)

并使用内置的2D数组,即

float m[4][4];

然后让foom一起使用的唯一方法是创建一个额外的“行索引”数组并传递它而不是m

...
float *m_rows[4] = { m[0], m[1], m[2], m[3] };
foo(m_rows);

无法直接将m传递给foo。是不可能的。参数类型float **与参数类型float [4][4]绝对不兼容。

此外,由于C99,以上可以更紧凑的方式表达,

foo((float *[]) { m[0], m[1], m[2], m[3] });

P.S。如果仔细观察,你会发现这与Carl Norum在答案中建议的基本相同。除了Carl是malloc - 数组内存,这不是绝对必要的。

答案 1 :(得分:8)

如果您无法更改foo(),则需要更改m。将其声明为float **m,并适当地分配内存。然后拨打foo()。类似的东西:

float **m = malloc(4 * sizeof(float *));
int i, j;
for (i = 0; i < 4; i++)
{
    m[i] = malloc(4 * sizeof(float));
    for (j = 0; j < 4; j++)
    {
        m[i][j] = i + j;
    }
}

之后不要忘记free()

答案 2 :(得分:3)

你做不到。 mfoo的参数不兼容。你必须使用一个临时的指针数组。

int main()
{
    float m[4][4];
    int i,j;

    float *p[4];

    p[0] = m[0];
    p[1] = m[1];
    p[2] = m[2];
    p[3] = m[3];

    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            m[i][j] = i+j;


    foo(p);

答案 3 :(得分:2)

如果您的编译器支持当前的C标准C99,那么您可以这样做:

foo((float *[]){ m[0], m[1], m[2], m[3] });

(请注意,这与AndreyT的答案完全相同,只是它放弃了必须命名临时数组)

答案 4 :(得分:2)

  • 您不需要在main中进行任何更改,但如果将函数的正式原型更改为(* pm)[4]或pm [] [4],则函数将正常工作,因为** pm表示指向整数指针的指针,而(* pm)[4]或pm [] [4]表示指向4个整数的poiner的指针。

    这里也是指向4个整数指针的指针,而不是指向整数指针的指针,因此不兼容。

    #include<stdio.h>
    void foo(float (*pm)[4])
    {
        int i,j;
        for (i = 0; i < 4; i++)
            for (j = 0; j < 4; j++)
                printf("%f\n", pm[i][j]);
    
    }
    
    int main ()
    {
        float m[4][4];
        int i,j;
        for (i = 0; i < 4; i++)
            for (j = 0; j < 4; j++)
                    m[i][j] = i+j;
    
        foo(m);
     }
    

答案 5 :(得分:0)

foo(m)不起作用吗?

答案 6 :(得分:0)

void foo(float **pm)void foo(float *pm[])相同,不是二维浮点数组。它是float*的数组。现在,那些float*本身可能指向浮点数组,但这是一个单独的问题。

答案 7 :(得分:0)

typedef float Float4[4];

void foo(Float4 *pm)
{
  int i,j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      printf("%f\n", pm[i][j]);
}

main()
{
  Float4 m[4];

  int i,j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      m[i][j] = i+j;

  foo(m);
  return 0;
}

答案 8 :(得分:0)

使用支持运行时大小的数组的C99,以下是传递2-dim数组的可能方法:

void foo(void *pm, int row, int col)
{
    float (*m)[col] = pm;

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++)
            printf("%4.1f%s", m[i][j], (j == col-1)?"\n":" ");

}

int main()
{
    float m[4][4];

    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
            m[i][j] = i+j;

    foo(m, 4, 4);

    return 0;
}