2011-09-07 60 views
1

該程序正確打印所有陣列輸出。但是這個程序是如何工作的?爲什麼我們在這裏需要地址s[i]如何處理數組指針?

#include <stdio.h> 

int main(){ 
     int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}}; 
     int (*p)[2]; 
     int i,j,*pint; 

     for(i=0;i<4;++i){ 
       p = &s[i]; 
       pint = (int*)p; 
       printf("\n"); 
       for(j=0;j<=1;++j) 
         printf("%d ",*(pint+j)); 
     } 
     return 0; 
} 
+1

請在這裏內嵌這段代碼,它不是很長。 – Mat

+5

爲了回答你的問題,坦率地說,它根本不需要。代碼的作者顯然不喜歡雙重索引,展示了使用指針或其他原因的不同方法。 –

+0

我只是想知道這個東西是如何工作的。 –

回答

2

int (*p)[2]是一個指向int [2]型,其本身實質上是一個int *類型,但是具有一些附加類型在陣列邊界檢查。

因此在p = &s[i];中,您將p設置爲指向數組s[i]所在的內存區域的指針的地址。

p也作爲一個數組(也就是「本質上」指向內存中帶有額外機器的區域的指針),然後直接使用它指向數組內存區域(p = s[i])要容易得多。但是,在那種情況下,這正是pint(作爲一個真正的指針)正在做的事情,所以我們可以完全刪除p

所以:

#include <stdio.h> 

int main(){ 
     int s[4][1] = {{1234,1},{1233,2},{1232,3},{1331,4}}; 
     int i,j,*pint; 

     for(i=0;i<4;++i){ 
       pint = (int*)s[i]; 
       printf("\n"); 
       for(j=0;j<=1;++j) 
         printf("%d ",*(pint+j)); 
     } 
     return 0; 
} 

Arrays and pointers或谷歌的 「C數組和指針」,也Pointer address in a C multidimensional array

注意,我假設你只是這樣做來玩弄和理解指針和數組如何交互,所以我沒有評論在每種情況下是否理想地使用指針算術或數組概念等等。


還要注意,我說的數組是「本質上是一個指針[...]」,但是,這並不完全正確,它只是就像在很多情況下的指針和最這是考慮事情如何工作的一種合理方式。實際上,數組以特殊方式處理。見Is array name equivalent to pointer?Arrays

+0

「......使'p'也是一個數組(也是指向內存區域的指針)」不,數組是**不是**指針。 –

+0

更正並在最後添加了一個註釋。 – MGwynne

+0

「因此,在'p = &s[i];'中,您將'p'設置爲指針的地址...」。這是錯誤的。在這種情況下,沒有指針來表示地址。這段代碼讓'p'指向一個'int [2]'數組。該數組由兩個「int」組成,而沒有其他內容。沒有指針。 – AnT

1
#include <stdio.h> 

int main(){ 
     int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}}; 
     int (*p)[2]; 
     int i,j,*pint; 

     for(i=0;i<4;++i){ 
       p = &s[i]; 
       pint = (int*)p; 
       printf("\n"); 
       for(j=0;j<=1;++j) 
         printf("%d ",*(pint+j)); 
     } 
     return 0; 
} 

這裏p被定義爲可以存儲兩個整數的數組中的值外

int (*p)[2]; 

for循環我們使用P排列的存儲4 {1維}。 1一次。

p = &s[i]; 

是在第一次迭代這將是

p = &s[0] ; 
i.e p = {1234,1} 

下一個迭代將

p = &s[1] ; 
i.e p = {1234,2} 

等。這就是爲什麼我們需要& S [I]

內環 只是迭代1個維陣列通過量以打印元件

1

唉。我不確定這段代碼應該說明什麼,而不是如何使易於理解的代碼難以理解。

sint的2元素陣列的4元素陣列。也就是說,對於i在0 ..3,s[i]的類型爲int [2](其在大多數情況下衰減到int *),並且&s[i]的類型是int (*)[2]

p是指向2元素數組int的指針。每次通過循環時,p被分配了2個元素數組的地址s[i]

最後,pint是一個簡單的指針int,並在穿過迴路每次被設置爲指向所述第一元件在陣列指向p*(pint + j)是很長的寫作方式pint[j]

請注意,ppint都是完全是多餘的;這基本上是一種囉嗦的寫作方式

for (i = 0; i < 4; i++) 
{ 
    for (j = 0; j < 2; j++) 
    printf("%d ", s[i][j]); 
    printf("\n"); 
}