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

作者: gowrite (gowrite)   2017-09-03 22:07:28
開發平台(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):
初學
在請各位前輩解惑了
謝謝
作者: justinj (黑旋風)   2017-09-03 22:26:00
因為是"int"指標請宣告"1byte"指標
作者: steve1012 (steve)   2017-09-03 23:29:00
Keyword pointer arithmetic
作者: chuegou (chuegou)   2017-09-04 00:54:00
自定型別指定長度阿 enum struct
作者: LPH66 (-6.2598534e+18f)   2017-09-04 01:05:00
應該這麼說, 指標的 + 意思不是位址的加, 而是陣列元素的加因為一次是移動一個元素 (這個指標指向的東西) 的關係才會造成你所觀察到的狀況你所謂 pointer 的型態就是這個指標指向的是一個什麼東西也就是說, 指標不只有值重要, 指標的型態也很重要
作者: steve1012 (steve)   2017-09-04 01:50:00
Void ptr 通常也是1byte 不過標準沒有規定就是了你就轉成char*就好了
作者: b0920075 (Void)   2017-09-04 04:02:00
以前沒有void*好像就是拿char*用
作者: boss0405 (boss)   2017-09-04 13:37:00
初學能思考這樣的問題真的很不錯,我看過寫了很久code的人真的以為是位址+1這觀念搞懂很多code可以很精簡

Links booklink

Contact Us: admin [ a t ] ucptt.com