[問題] 關於指標、記憶體位址的問題

看板C_and_CPP作者 (gowrite)時間8年前 (2017/09/03 22:07), 8年前編輯推噓6(609)
留言15則, 6人參與, 最新討論串1/1
開發平台(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

09/03 22:26, , 1F
因為是"int"指標
09/03 22:26, 1F

09/03 22:30, , 2F
請宣告"1byte"指標
09/03 22:30, 2F

09/03 23:29, , 3F
Keyword pointer arithmetic
09/03 23:29, 3F
哦!!! 原來 char pointer 也可以用在 別的型態的變數上哦 我以為不能混用, 看來用甚麼型態的 pointer 只有跟 pointer 在記憶體位址跳幾格有關係 而 pointer 跟要對應的變數型態沒有硬性規定, 果然應該多嘗試多問,又學到了。 謝謝大家提點 另外補問一點推文說的 1 byte pointer 應該就是指的就是 char *ptr 吧?? 還是有別的 1 byte pointer ? 謝謝 ※ 編輯: gowrite (123.195.54.122), 09/04/2017 00:43:00

09/04 00:54, , 4F
自定型別指定長度阿 enum struct
09/04 00:54, 4F

09/04 01:05, , 5F
應該這麼說, 指標的 + 意思不是位址的加, 而是陣列元素的加
09/04 01:05, 5F

09/04 01:06, , 6F
因為一次是移動一個元素 (這個指標指向的東西) 的關係
09/04 01:06, 6F

09/04 01:06, , 7F
才會造成你所觀察到的狀況
09/04 01:06, 7F

09/04 01:07, , 8F
你所謂 pointer 的型態就是這個指標指向的是一個什麼東西
09/04 01:07, 8F

09/04 01:08, , 9F
也就是說, 指標不只有值重要, 指標的型態也很重要
09/04 01:08, 9F

09/04 01:50, , 10F
Void ptr 通常也是1byte 不過標準沒有規定就是了
09/04 01:50, 10F

09/04 01:50, , 11F
你就轉成char*就好了
09/04 01:50, 11F
※ 編輯: gowrite (123.195.54.122), 09/04/2017 03:14:50

09/04 04:02, , 12F
以前沒有void*好像就是拿char*用
09/04 04:02, 12F

09/04 13:37, , 13F
初學能思考這樣的問題真的很不錯,我看過寫了很久code
09/04 13:37, 13F

09/04 13:37, , 14F
的人真的以為是位址+1
09/04 13:37, 14F

09/04 13:37, , 15F
這觀念搞懂很多code可以很精簡
09/04 13:37, 15F
文章代碼(AID): #1Ph0oZcu (C_and_CPP)