簡體   English   中英

通過指針傳遞二維數組

[英]Passing two-dimensional array via pointer

如何將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???);
}

如果你堅持上述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] });

PS如果仔細觀察,你會發現這與Carl Norum在答案中建議的基本相同。 除了Carl是malloc -ing數組內存,這不是絕對必要的。

如果你不能改變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()

你不能。 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);
  • 您不需要在main中進行任何更改,但如果將函數的正式原型更改為(* pm)[4]或pm [] [4],則函數將正常工作,因為** pm表示指向指針的指針整數while(* pm)[4]或pm [] [4]表示指向4個整數的poiner的指針。

    這里的m也是指向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); } 

如果您的編譯器支持當前的C標准C99,那么您可以這樣做:

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

(請注意,這與AndreyT的答案完全相同,只是它放棄了必須命名臨時數組)

foo(m)不起作用嗎?

void foo(float **pm)void foo(float *pm[]) ,它不是浮點數的二維數組。 它是一個float*數組。 現在,那些float*本身可能指向浮點數組,但這是一個單獨的問題。

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;
}

使用支持運行時大小的數組的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM