地址

2015-01-31 27 views
0

我在這個代碼地址

`int main(){ 
int arr[3][4]={1,2,3,4, 
      4,3,2,1, 
      7,8,9,0}; 


printf("%x %x %x \n",arr,arr+1,&arr+1); 
return 0;}` 

輸出衝突,在我看來如下: 9278fc40 9278fc50 9278fc70

之間有什麼區別ARR + 1,& ARR + 1: 我沒有關係

任何人都可以幫助請

+0

可能的重複[數組名稱是一個指針在C?](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) – 2015-01-31 19:26:33

+2

有沒有「地址的地址陣列「在任何地方的這個問題。在許多情況下,您可能會知道數組會衰減(隱式轉換)爲指向其第一個元素的指針。這裏,將'arr'傳遞給函數實際上會傳遞一個指向其第一個元素('&arr [0]')的指針。 'arr + 1'沒有區別:它會導致'&arr [1]'。現在'&arr + 1'是一個不同的野獸 - 作爲一元&的操作數,數組不會衰減成指針,所以'&arr'意思是:指向2D數組的指針,或者是int *)[3] [4]'。現在我想你可以找出其餘的。 – 2015-01-31 19:28:49

回答

0

對於兩個第一個參數,您正在打印int值arr [0] [0],arr [0] [1]的內存地址。 & arr + 1是不同的。這裏+ 1迭代列。所以& arr + 1實際上指向第二列的第一個int的內存地址。

+0

你在第二次和第三次分析中不正確,第一次只是部分糾正。第一個產生'arr [0]'的地址,該地址*然後*轉換爲產生'arr [0] [0]'的地址的指針。第二個轉換爲一個指向'arr [1]'的指針,然後它轉換爲一個指向'arr [1] [0]'的指針。最後,'&arr + 1'指向*'arr'後的第一個'int [3] [4]'* *(其中沒有)。最後一個表達式在陣列的arr數組的定義區域中產生一個落在*無處*的地址。 – WhozCraig 2015-01-31 22:40:21

+0

當!你是對的!我在想什麼。在你的帖子後,我去調試器檢查&ARR + 1只是爲了確保。你應該寫這個(我的意思是你的評論)作爲一個正確的答案。 – sandman 2015-02-01 00:58:18