引言
到了春季的三四月份,东区的各大实验室都开始陆续纳新。大多数的纳新试题都考到了C语言有关的知识,看到3G实验室的一道题,这让我想起当我面试实验室的时候的一道题,非常有趣,今天我来和大家分享一下这道题
#include <stdio.h>int main (){ int a[4]={1,2,3,4}; int*ptr1=(int*)(&a+1); int*ptr2=(int*)((int)a+1); printf("%x,%x",ptr1[-1],*ptr2); return 0;}
这道题涉及到了指针,数组,强制类型转换以及运算符的优先级和大端序小端序,主要是体会指针指向的特点。
在我电脑上输出的值是 4,0200 0000(2000000)
然后让我给大家详细的分析一下这道题;
a是一个具有4个整型变量的数组的名字, &a是数组的首地址。&a+1表示让指针指向下一个数据,于是a的指向了4的下一个地址,用此来初始化ptr1,所以part1的指向如下:
在ptr1初始化的时候,令&a+1强制转换成整型指针,所以 ptr1[-1]相当于把ptr1往前挪一个整型大小,即4个字节,然后呢,
所以呢,打印出的第一个数字是a[3]的内容,即4!
第二部分
ptr2先将a组数转化成整形变量,然后加1然后再转化成整形指针,所以此时 ptr2的指向在
然后因为整形为四个字节,所以此时指向的是a{0}的后三个字节和a[1]的第一个字节,具体如下图(在x86系统下的数据存储),
因为x86系统是小端序,读取数据或存储数据的时候是最低位对应低地址,所以打印
0200 0000。