2016-01-20 53 views
0

在我主我訪問使用指針二維數組用C

int mat[ROW][COL]; 
    int *p = &mat[0][0]; 
    minput(p, ROW, COL); 

我卡在如何讓minput,因爲我應該初始化組數字的二維數組,但我只是不「噸明白我應該如何分配號碼,

我得到的M [0] [0]指針是*(*(m+0)+0),但它不會讓我這樣做*(*(m+0)+0)=0;

,因爲它給出invalid type argument of unary ‘*’ (have ‘int’)錯誤。

所以基本上我只是想知道如何使用指針分配一個數字到2d數組,如果我們不需要使用指針,那麼這對m [2] [2] = 5是很容易的,我不知道如何用指針來做到這一點。

我的教授提供了minput函數的單行示例,它只是*(m+0) = 8;,這對我來說沒有意義,是不是我們用於1d數組?如果這是做到這一點的方法,那麼這是否意味着我應該做一些像

*(m+0) = 8; 
*(m+1) = 1; 
*(m+2) = 6; 
*(m+3) = 3; 
*(m+4) = 5; 
*(m+5) = 7; 
*(m+6) = 4; 
*(m+7) = 9; 
*(m+8) = 2; 

爲3x3陣列?這對我來說似乎不太合適,如果有人能夠幫助我解決這個問題,這將是非常棒的,指針對我來說非常混亂。

編輯:讓我看,顯然以正確的方式來做到這一點是我上面的 *(*(m+0)+0) = val

,但我這樣做,在我的代碼的時候,我得到這個錯誤中列出的方法:

error: invalid type argument of unary ‘*’ (have ‘int’) 
    *(*(m+0)+2)=6; 
^

這是爲什麼?這個任務是否錯誤?

+0

爲什麼不能將二維數組作爲指向數組的指針?即'f(int arr [ROW] [COL])'?其他任何東西都是無稽之談。 (它被轉換爲'int(*)[COL]',但你可以像往常一樣使用2D索引)。並且使'p'成爲正確的類型! – Olaf

+0

哦,如果你的教授提供的是真正意義上的二維數組,改變過程。並啓用編譯器警告並注意它們 - 特別是當涉及指針和數組時。 – Olaf

回答

0

這是正確的。您可以使用

*(m + (rowNumber*COL) + colNumber) = val 

來訪問它。基本上二維數組中的元素連續存儲在內存中,m指向它的開始。所以你可以用這種方式做一維數組。這就是爲什麼我們不使用類似** m的東西,因爲它不是「指向指針的指針」,即使它是一個二維數組。

+0

你應該補充說,這就是爲什麼我們不能將2D數組轉換成雙指針(int **),這是一個常見的錯誤。 –

+0

好點。謝謝:) – myin528

+0

所以如果我想給m [2] [2]賦值4,我會做'*(m +(2 * COL)+ 2)= 4'? –

1

你擁有它初始化*((p+0) + 0) = 1;將使mat[0][0] = 1;

*((p+0) + 1) = 2; would be mat[0][1] = 2; 
*((p+1) + 0) = 3; would be mat[1][0] = 3; 

等方式..

1

假設你有二維數組聲明爲arr[rows][cols]。然後:

  • arr指向第一子陣列
  • arr + 1點到第二子陣
  • *(*(arr+2)+3)相當於arr中[2] [3]

所以,如果你想要分配val以第二行的第一個元素爲例:

*(*(mat+1) + 0) = val;