程序如下:
int main (void)
{
int a[4]={1,2,3,4};
int p=(int )((int)a+1);
printf("%x",*p);
return(0);
}
运行结果为2000000,指针应该是从数组元素1的第2个字节到数组元素2的第一个字节,不知道每个字节里面是什么表现形式以及为什么是2000000??
我是在一篇博客上看到的,这是我不明白的部分。我把链接发出来,大家可以看看。
https://blog.csdn.net/mhjcumt/article/details/7355127
文字说明
a 是指向 a[0] 指针。假设a[0]的地址转换为10进制是 32345
那么(int) a = 32345
(int) a +1 = 32346
也就是a[0] 的第二个字节
(int*)((int) a+1)
是将(int) a +1
变成指针,指针的值是32346 ,也就是指针的首地址是a[0]的第二个字节。
那么 指针(int*)((int) a+1)
所指向的内存的四个字节的值分别是 0 0 0 2
*(int*)((int) a+1)
是取出指针所在地址的值:
很显然,在上面内存地址中左边是小端,也就二进制的低位,那么 0 0 0 2 应该就是 2 0 0 0 转换为二进制就是(每个字节是八个bytes)
0000 0010 0000 0000 0000 0000 0000 0000
转换为十六进制就是
2000000
谢谢您的回答。
不好意思,我太马虎了,应该是int p=(int )((int)a+1); 而且我不太明白指针为什么不能强制转换为int。
我的思路是:假如指针a值2000,(int)a+1是整数且值为2001,(int *)((int)a+1)是把整数2001转化为指针且占4个字节,就是从a[0]地址(从0开始)的第1个字节,到a[1]地址的第0字节,共占4个字节。就是不明白为什么是2000000。
@Shendu.CC: 我是直接把指针转换为int,(int)a。编译器没有报错啊,我用的是C-free。p是指针在这个编译器上是60ff21到60ff24.
@Shendu.CC:
没想到图片这么大!!!
@Shendu.CC: 我程序贴错了,但是我说运行结果了,我不明白的是为什会是20000000
@Shendu.CC: 我现在坐车用的是手机,5分钟后到家再发。
@没有翅膀的脚: 看了博客我才明白,我用的mac的Xcode编译器,(int)a 这样的操作,不允许。
@没有翅膀的脚: 我把图给你贴在我的回答上。你凑合着看。
谢谢大佬,图文搭配,讲述的简单易懂!!!
p定义的是个局部变量,内存地址分配是不固定的,就算你程序再运行一次,也不一定是内存20000000
int *p来指向(int)((int)a+1),这样才获取的是数组地址的偏移