2014-09-26 34 views
1

我是新來的C語言編程,並一直在尋找這個問題的幾天二維數組...指針在C

int arr[][2]={11,22,33,44,55,66}; 
int (*ptr)[2]=&arr[1]; //line a 
int (*ptr1)[2]=arr[1]; //line b 

對於線(一)編譯器沒有問題,但是對於線(B )它給出ERROR-cant convert int* to int[2]*

現在&arr[1]arr[1]具有相同的大小(當我檢查sizeof運算符時)。

那麼請幫助我瞭解究竟發生了什麼? arr[1]&arr[1]有什麼區別?謝謝!

+0

看到這裏,它應該幫助: http://stackoverflow.com/questions/2094666/pointers-in-c-when-to-use-the-ampersand-and-the-asterisk – pez 2014-09-26 01:52:00

回答

2

「相同大小」並不意味着「相同類型」。有相同尺寸的各種類型。

arr[1]有型號int[2]。所以&arr[1]有類型int(*)[2],所以line a是好的。

當您使用數組類型的表達和它不是&sizeof操作數時,其經歷左值到右值的轉換,和這個轉換的結果是一個指針數組的第一個元素。 (這有時稱爲衰變)。

所以在line b衰減後,arr[1]&arr[1][0]相同,其類型爲int *。這與int (*)[2]不兼容,因此分配失敗。

兼容類型對於指針的定義是(釋義)該類型是相同的。除了void *之外的非兼容指針之間的任何賦值都需要進行強制轉換(並且可能不會達到您期望的效果)。

如需進一步閱讀,請檢查the C FAQ,也許還會搜索此網站以獲取有關該主題的高評分問題。

+0

非常感謝。我沒有意識到這個衰變概念,所以這個答案真的很有幫助。 – Suraj 2014-09-27 04:05:52