两个指针有关的问题
前一段时间忙保研,第一个选择是去中科院计算所,自己本身专业是通信的,暑假做了
电赛,结果没冲到国奖,反而还耽误了保研的事,当时点赛结束前保研工作就开始了,有的
同学暑假都把老师给定下了。唉,一天下午5点,还没有吃饭,临时接到电话,老师有事,提
前面试,能赶到尽量赶到。呵呵好不容易做动车在8:30赶到,等到面我的时候,自己疑问三
不知啊。老师给其他人做了下面的题目,但说我不是学计算机的,不给我做,不难为我。可
是拿了一张看看觉得自己还是会答一些的,可是最近蛋疼的验证一下,第一题不对,有些郁闷,
想写出来,结果写的时候,忽然明白了,果然写博客有好处……
不说了,上题:
(1)请给出下面代码在32位x86计算机上的运行结果
(2)如果不假设“32位 x86计算机”这一条件,回答上一问题时需要考虑哪些事项?
View Code
1 #include <stdio.h>
2 int main()
3 {
4 int a[5] = {1,2,3,4,5};
5 int *pa = (int)(&a) + 1;
6 printf("%x\n",*pa);
7 return 0;
8 }
实际输出结果为
2000000
这个题目好像应该是这样的,32位x86机为小端模式,一个int型占4字节,
这样上面的数组a[5]的存储形式(地址下从低到高依次是):10002000300040005000 ……(1)
但是实际如果用十六进制表示,每四位给表示一下就是01 00 00 00 02 00 00 00 03 00 00 00
04 00 00 00 05 00 00 00 ……(2)
我们假定(1)中从左右的地址为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
所以这样就比较明朗了,当&a时取的是数组a[]的地址,即(1)中的a[0] 的起始字节,当然如果这
时候直接加上1之后&a+1就是20,但是这里强制转换成为int型,然后加1,却变成了1。接着将这个值
赋给一个整形指针,*pa就代表了起始地址为1的那个整数了四个字节内容为0002,但是要是按照%x
即十六进制输出,按照(2)就是2000000,前面的一个0没显示。
第二题
View Code
1 #include<stdio.h>
2 int main()
3 {
4 int x;
5 int a[5] = {0x11121314, 0x21222324, 0x31323334, 0x41424344,
6 0x51525354};
7 for(x = 0; x < 20;x++)
8 {
9 printf("%02x ",*(char *)((int)(&a) + x));
10 }
11 printf("\n");
12 for(x = 0; x < 8; x++)
13 {
14 printf("%08x ",*(int *)((int)(&a) + x));
15 }
16 printf("\n");
17 return 0;
18 }
按照之前的第一题的分析,可以得到这里a[5]的存储形式为 14131211 24232221 34333231 44434241 54535251
依然假设地址从左到右依次为0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
第一个for循环得用两位的形式显示字符型数据char的值,从地址0(即x=0时,(int)(&a)+x的值)
开始到19 依次输出为14 13 12 11 24 23 22 21 34 33 32 31 44 43 42 41 54 53 52 51
第二个for循环就简单了,按照第一题的分析,输出就是11121314 24111213 23241112 22232411 21222324 34212223 33342122 32333421.
吼吼,终于明朗~\(≧▽≦)/~啦啦啦


浙公网安备 33010602011771号