作者gowrite (gowrite)
看板C_and_CPP
标题[问题] 关於指标、记忆体位址的问题
时间Sun Sep 3 22:07:28 2017
开发平台(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/cn.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