看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1504447651.A.9B8.html
justinj: 因為是"int"指標 09/03 22:26
justinj: 請宣告"1byte"指標 09/03 22:30
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
chuegou: 自定型別指定長度阿 enum struct 09/04 00:54
LPH66: 應該這麼說, 指標的 + 意思不是位址的加, 而是陣列元素的加 09/04 01:05
LPH66: 因為一次是移動一個元素 (這個指標指向的東西) 的關係 09/04 01:06
LPH66: 才會造成你所觀察到的狀況 09/04 01:06
LPH66: 你所謂 pointer 的型態就是這個指標指向的是一個什麼東西 09/04 01:07
LPH66: 也就是說, 指標不只有值重要, 指標的型態也很重要 09/04 01:08
steve1012: Void ptr 通常也是1byte 不過標準沒有規定就是了 09/04 01:50
steve1012: 你就轉成char*就好了 09/04 01:50
※ 編輯: gowrite (123.195.54.122), 09/04/2017 03:14:50
b0920075: 以前沒有void*好像就是拿char*用 09/04 04:02
boss0405: 初學能思考這樣的問題真的很不錯,我看過寫了很久code 09/04 13:37
boss0405: 的人真的以為是位址+1 09/04 13:37
boss0405: 這觀念搞懂很多code可以很精簡 09/04 13:37