引言
到了春季的三四月份,東區(qū)的各大實驗室都開始陸續(xù)納新询兴。大多數(shù)的納新試題都考到了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; }
這道題涉及到了指針族扰,數(shù)組,強制類型轉換以及運算符的優(yōu)先級和大端序小端序,主要是體會指針指向的特點怒竿。
在我電腦上輸出的值是 4,0200 0000(2000000)
然后讓我給大家詳細的分析一下這道題耕驰;
a是一個具有4個整型變量的數(shù)組的名字录豺, &a是數(shù)組的首地址。&a+1表示讓指針指向下一個數(shù)據(jù)厚骗,于是a的指向了4的下一個地址领舰,用此來初始化ptr1迟螺,所以part1的指向如下:
在ptr1初始化的時候锉桑,令&a+1強制轉換成整型指針民轴,所以 ptr1[-1]相當于把ptr1往前挪一個整型大小,即4個字節(jié)后裸,然后呢微驶,
所以呢苟耻,打印出的第一個數(shù)字是a[3]的內(nèi)容凶杖,即4官卡!
第二部分
ptr2先將a組數(shù)轉化成整形變量寻咒,然后加1然后再轉化成整形指針,所以此時 ptr2的指向在
然后因為整形為四個字節(jié),所以此時指向的是a{0}的后三個字節(jié)和a[1]的第一個字節(jié),具體如下圖(在x86系統(tǒng)下的數(shù)據(jù)存儲)叫挟,
因為x86系統(tǒng)是小端序抹恳,讀取數(shù)據(jù)或存儲數(shù)據(jù)的時候是最低位對應低地址,所以打印
0200 0000署驻。