[问题] 关于指标、内存位址的问题

楼主: 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