C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) windows 8 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) n/a 問題(Question): 最近在初學指標有一點小疑問,所以想做個實驗 我先設定了一個 int 的陣列 我知道 int 的預設空間是 4 bytes 陣列的開頭記憶體位址是 arr == 0028FEF8 所以每一個陣列的每一個元素就是 0028EFE8 開始遞增 4 所以是 0028FEF8 0028FEFC 0028FF00 0028FF04 0028FF08 我去取值的寫法是用 loop i++ 遞增 arr + i arr + 0 == arr[0] == 0028EFE8 arr + 1 == arr[1] == 0028EFEC . . arr + 4 == arr[4] == 0028FF08 我想問的問題是 為什麼 arr + 1 不是 0028EFE8 + 1 == 0028EFE9 ?? 不管我用 arr+1,或者 ptr + 1 他都會自動跳 4 bytes,自己去找到每個陣列元素的記憶體位址開頭 為什麼,我用 ptr + 1 不會取到 arr[0] 跟 arr[1] 之間的 0028EFE9 的這個位址 ?? 請問有辦法可以取到 arr[0] 0028EFE8 arr[1] 0028EFEC 之間的三個記憶體位址 0028EFE9 0028EFEA 0028EFEB 這三個位址嗎?? 餵入的資料(Input): 預期的正確結果(Expected Output): 輸出結果沒問題 只是想做個實驗,更加理解指標跟記憶體位址 address of arr[0] = 0028FEF8 address of arr[1] = 0028FEFC address of arr[2] = 0028FF00 address of arr[3] = 0028FF04 address of arr[4] = 0028FF08 錯誤結果(Wrong Output): n/a 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> int main(){ int arr[] = {10,20,30,40,50}; int i=0; int *ptr = &arr[0]; for( i ; i < 5 ; i++ ){ printf( "address of arr[%d] = %p\n" , i , arr+i ); printf( "address of arr[%d] = %p\n" , i , ptr ); ptr += 1; } } 補充說明(Supplement): 初學 在請各位前輩解惑了 謝謝 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.54.122
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1504447651.A.9B8.html
1F:→ justinj: 因為是"int"指標 09/03 22:26
2F:→ justinj: 請宣告"1byte"指標 09/03 22:30
3F:推 steve1012: Keyword pointer arithmetic 09/03 23:29
哦!!! 原來 char pointer 也可以用在 別的型態的變數上哦 我以為不能混用, 看來用甚麼型態的 pointer 只有跟 pointer 在記憶體位址跳幾格有關係 而 pointer 跟要對應的變數型態沒有硬性規定, 果然應該多嘗試多問,又學到了。 謝謝大家提點 另外補問一點推文說的 1 byte pointer 應該就是指的就是 char *ptr 吧?? 還是有別的 1 byte pointer ? 謝謝 ※ 編輯: gowrite (123.195.54.122), 09/04/2017 00:43:00
4F:推 chuegou: 自定型別指定長度阿 enum struct 09/04 00:54
5F:推 LPH66: 應該這麼說, 指標的 + 意思不是位址的加, 而是陣列元素的加 09/04 01:05
6F:→ LPH66: 因為一次是移動一個元素 (這個指標指向的東西) 的關係 09/04 01:06
7F:→ LPH66: 才會造成你所觀察到的狀況 09/04 01:06
8F:→ LPH66: 你所謂 pointer 的型態就是這個指標指向的是一個什麼東西 09/04 01:07
9F:→ LPH66: 也就是說, 指標不只有值重要, 指標的型態也很重要 09/04 01:08
10F:推 steve1012: Void ptr 通常也是1byte 不過標準沒有規定就是了 09/04 01:50
11F:→ steve1012: 你就轉成char*就好了 09/04 01:50
※ 編輯: gowrite (123.195.54.122), 09/04/2017 03:14:50
12F:推 b0920075: 以前沒有void*好像就是拿char*用 09/04 04:02
13F:推 boss0405: 初學能思考這樣的問題真的很不錯,我看過寫了很久code 09/04 13:37
14F:→ boss0405: 的人真的以為是位址+1 09/04 13:37
15F:→ boss0405: 這觀念搞懂很多code可以很精簡 09/04 13:37







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP