[問題] 有關指標的轉型和偏移

看板C_and_CPP (C/C++)作者 (薏仁做事薏仁湯)時間13年前 (2013/01/23 10:54), 編輯推噓0(0023)
留言23則, 4人參與, 最新討論串1/1
已爬文但關鍵字不知道該怎下,所以想請問一下版大 程式碼 int main (void) { int arr[3] = {1, 2, 3}; int* ptr =(int*)(&arr+1); printf ("%d \n", *(ptr-1)); return 0; } 上面程式我執行完的結果是 3 但我自己解讀的結果是 1 我的想法是指標ptr 指向陣列arr的位置+1,所以是arr[1] 在printf的時候又將 ptr-1,所以又指回arr[0]位置, 因此結果為 1 想問一下我的觀念那邊有問題,還有(int *)跟(&arr+1)的觀念和作用 感謝~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.97.137

01/23 10:59, , 1F
&arr+1 --> (int [3])+1 --> 指向 arr 最後的後一個位置
01/23 10:59, 1F

01/23 13:15, , 2F
arr + 1 或 &arr[0] + 1 才是如同你所敘述的。
01/23 13:15, 2F

01/23 15:53, , 3F
上面的我懂了,還有一個問題是為什麼要加(*int)編譯才會過
01/23 15:53, 3F

01/23 15:54, , 4F
指標一般不是可以指向一個位置嗎
01/23 15:54, 4F

01/23 15:57, , 5F
更正(int *)
01/23 15:57, 5F

01/23 18:58, , 6F
因為 "資料型態" 不同啊!一個是 int * , 一個是 int *[3]
01/23 18:58, 6F

01/23 18:59, , 7F
沒強制轉型的話可能會有 warnning 出現,加了就消 warning
01/23 18:59, 7F

01/23 19:06, , 8F
改一下好了,另一個寫 int (*)[3] 較正確.
01/23 19:06, 8F

01/23 19:52, , 9F
我有點還是不太懂為什麼arr加了&就變成了int (*)[3]
01/23 19:52, 9F

01/23 19:53, , 10F
是代表指標陣列的意思嗎
01/23 19:53, 10F

01/23 19:57, , 11F
還有就是我後來試了一下印出&arr、&arr[o]、arr的位置
01/23 19:57, 11F

01/23 19:58, , 12F
結果都是一樣的位址,感覺&arr好像沒只到陣列的最後
01/23 19:58, 12F

01/23 19:58, , 13F
感謝回答
01/23 19:58, 13F
※ 編輯: athin7 來自: 123.193.97.137 (01/23 20:06)

01/23 20:14, , 14F
指標的型態不同說穿了不過是"所指的元素型態"不同罷了。
01/23 20:14, 14F

01/23 20:15, , 15F
指標 +1 會指向下一個元素。
01/23 20:15, 15F

01/23 20:16, , 16F
比如說 char * 型態的 +1 位址會多 1, int * 則會多 4
01/23 20:16, 16F

01/23 20:18, , 17F
對 arr 取位址所得到的指標所指的元素就是 arr,大小是 12
01/23 20:18, 17F

01/23 20:19, , 18F
+1 就會指向 arr 的位址後面 12 BYTES 的位址。
01/23 20:19, 18F

01/23 21:21, , 19F
明白了!!!那還有int (*)[3] 和 int *arr[3]是一樣的嗎?
01/23 21:21, 19F

01/23 21:38, , 20F
int (*arr)[3] 翻成英文 http://ppt.cc/mHTy
01/23 21:38, 20F

01/23 21:57, , 21F
那int (*)[3]在那網頁翻不出來= =?
01/23 21:57, 21F

01/24 00:49, , 22F
int (*)[3] 跟 int (*arr)[3] 是一樣的意思^_^
01/24 00:49, 22F

01/24 11:32, , 23F
01/24 11:32, 23F
文章代碼(AID): #1G_r3bxE (C_and_CPP)
文章代碼(AID): #1G_r3bxE (C_and_CPP)