首页新闻找找看学习计划

C语言指向数组的指针,每个字节里面都是什么以及怎么排序的?

0
悬赏园豆:50 [已解决问题] 解决于 2018-12-12 21:13

程序如下:

include <stdio.h>

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

没有翅膀的脚的主页 没有翅膀的脚 | 初学一级 | 园豆:58
提问于:2018-12-11 15:06
< >
分享
最佳答案
1

文字说明
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

收获园豆:50
Shendu.CC | 小虾三级 |园豆:1811 | 2018-12-12 13:29

谢谢您的回答。
不好意思,我太马虎了,应该是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。

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 16:39

@Shendu.CC: 我是直接把指针转换为int,(int)a。编译器没有报错啊,我用的是C-free。p是指针在这个编译器上是60ff21到60ff24.

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 17:09

@Shendu.CC:
没想到图片这么大!!!

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 17:10

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 17:13

@Shendu.CC: 我程序贴错了,但是我说运行结果了,我不明白的是为什会是20000000

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 17:36

@Shendu.CC: 我现在坐车用的是手机,5分钟后到家再发。

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 17:47

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 18:15

@没有翅膀的脚: 看了博客我才明白,我用的mac的Xcode编译器,(int)a 这样的操作,不允许。

Shendu.CC | 园豆:1811 (小虾三级) | 2018-12-12 19:50

@没有翅膀的脚: 我把图给你贴在我的回答上。你凑合着看。

Shendu.CC | 园豆:1811 (小虾三级) | 2018-12-12 20:07

谢谢大佬,图文搭配,讲述的简单易懂!!!

没有翅膀的脚 | 园豆:58 (初学一级) | 2018-12-12 21:14
其他回答(1)
0

p定义的是个局部变量,内存地址分配是不固定的,就算你程序再运行一次,也不一定是内存20000000
int *p来指向(int)((int)a+1),这样才获取的是数组地址的偏移

finn.tang | 园豆:211 (菜鸟二级) | 2018-12-12 17:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册