2014-08-30 93 views
-1

我給下面的代碼片段:指向二維數組

int group1[3][3] = {3,4,5,1,9,8}; 
int group2[3][3] = {{1},{2,3},{4,5}}; 
int *gPtr1 = group1; 
int *gPtr2 = group2; 

的問題是問我的價值:(我應該回答這個問題在紙面上,當然,沒有電腦)

*(gPtr1 + 3) 
*(gPtr2 + 3) 

通常,我知道一維數組中它增加了一個「地址」而不是值。因此,例如:

int balance[10]={1,2,6,4}; 
int *p=balance; //p points to balance [0] 

p+=3;   //points to balance [3] 

不過,我似乎無法使一個指向一個二維數組來測試這一點作爲的問題,我總是得到一個「從兼容的指針類型初始化」的錯誤。

+1

如果沒有來自體面編譯器的警告,代碼將無法編譯 - 因爲初始化指針的類型不匹配比第一個初始化器中的不完整大括號更多。你可以通過使用int * gPtr1 =&group1 [0] [0];'和int * gPtr2 =&group2 [0] [0];來解決這些問題;(你會得到代碼作者的意圖你得到)。你知道這個問題正在爭取什麼嗎? – 2014-08-30 15:11:33

回答

0

二維矩陣在內存中按行優先順序表示。這是因爲內存是一維的,所以它將二維數組存儲爲一個連續的行列表。

當您創建組1,你得到的是9長整型數組,它看起來像:

3 4 5 1 9 8 _ _ _ 

所以,當你做*(gPtr1 + 3),它增加了3gPtr1原來的位置,這是3的地址。添加3可以讓您找到1的位置,您可以解除引用。

所以,當你創建羣組2,你得到的是9長整型數組,它看起來像:

1 _ _ 2 3 _ 4 5 _ 

所以,當你做*(gPtr2 + 3),它增加了3gPtr2原始位置,這是1的地址。添加3可讓您找到2的位置,您可以解除引用。

2

正確的記錄會像

int (*gPtr1)[3] = group1; 
int (*gPtr2)[3] = group2; 

而且這些表達

*(gPtr1 + 3) 
*(gPtr2 + 3) 

試圖數組的元素最後後訪問內存,因爲該陣列只有三行。這是*(gPtr1 + 3)表達式的類型是int[3],並且oridinal數組中只有三個這樣的元素。

,或者您可以寫

int *gPtr1 = (int *)group1; 
int *gPtr2 = (int *)group2; 

在這種情況下,使用陣列interpretated爲一維陣列,9種族元素和表達式指針

*(gPtr1 + 3) 
*(gPtr2 + 3) 

將返回相應

1 
2 
2

要訪問group1的地址,以這種方式將它傳遞給指針:

int *gPtr1 = &group1[0][0]; 

使用,很容易找到soultions:1和2

0

也許這將幫助你開始:

#include <stdio.h> 

int group1[3][3] = {3,4,5,1,9,8}; 
int group2[3][3] = {{1},{2,3},{4,5}}; 

int main(void) 
{ 
    int *p; 
    int i; 
    for (p = group1[0], i = 0; i < 9; ++i, ++p) 
     printf("%d - ", *p); 
    printf("\n"); 
    for (p = group2[0], i = 0; i < 9; ++i, ++p) 
     printf("%d - ", *p); 
    printf("\n"); 
    return 0; 
} 

如果你理解在二維數組的內存的存儲方式,應該清楚爲什麼這會起作用。既然我認爲理解是你想要的,我會讓你自己去理解那部分。 :-)

+0

非常真實,我沒有注意到標籤。固定。 – Anthony 2014-08-30 15:18:31