2012-08-08 103 views
5

我有一個節目約2-d陣列請解釋差

基ADRESS是8678

#include<stdio.h> 
#include<conio.h> 
main() 
{ 
int arr[3][3]={ 
       {83,8,43}, 
       {73,45,6}, 
       {34,67,9} 
       }; 
printf("%d ",&arr+1); //points to 8696 
printf("%d ",arr+1); //points to 8684 
return 0; 
} 

是什麼arr+1&arr+1之間的差異?

回答

9

嗯,它們是不同的東西。在大多數情況下,arr會衰減到指向數組第一個元素的指針 - 這意味着指向您的二維數組中第一個3元素行的指針:鍵入int (*)[3]arr + 1然後指向數組中的第二行。

&arr是陣列本身的地址(類型int (*)[3][3]),所以&arr + 1指向剛剛超過整個2D陣列末端的存儲器。

您可以通過不同的打印輕鬆地確認此行爲。具體而言,將偏移量打印到新指針而不是值本身將有助於清除問題。從你的程序的輸出從這些打印語句:

printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); 
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr); 

將是小數偏移&arr+1arr+1分別。下面是從一個測試運行輸出I剛纔:

36 
12 

36相匹配:3行×3列每個條目×4字節= 36個字節。那麼每個條目的12:1行×3列×4字節= 12個字節。

請注意 - 您也在使用%d打印指針,這是錯誤的。你可能應該使用%p

+2

的下一個數組的地址,我從你的答案學到了很多。謝謝。 – 2012-08-08 04:57:13

+0

使用'%p',您需要將指針轉換爲'void *'。 – 2012-08-08 05:29:41

1

您可以使用此等價的幫助下算出來:X [Y] === *(X + Y)

由於*(ARR + 1)===常用3 [1],編曲+ 1個=== & ARR [1]

同樣,& ARR + 1 === &((& ARR)[1])

什麼是(& ARR)[1]?井,(& ARR)[0] === * & ARR === ARR, 即,3×3陣列本身,因此(& ARR)[1]在所述3×3陣列緊接着, 和& ARR + 1 === &((& arr)[1])是跟在&之後的3x3陣列的地址...指向剛剛經過整個陣列的字節的指針。

-1

array + 1表示數組[1]的地址,它需要3個int內存。

& array + 1表示array [0]的地址add 1;

+0

錯誤。試試看,你會看到。甚至只是看看OP的輸出,我想。 – 2012-08-08 15:25:10

+0

泳池英語讓你誤解我。數組是指向數組地址的指針,(數組+ 1)是指向數組[1]的地址的指針。 &array是數組的地址,然後加上1. – hupantingxue 2012-08-16 07:27:21

+0

Carl Norum,你誤解了我。 – hupantingxue 2012-08-16 07:31:55

0

編曲+ 1給出了一個數組的下一個元素,而&改編+1給出整數