今天刷题的时候碰到如下的一道题:
int main() { int array[2019] = { 0 }; array[19] = 2019; unsigned long offset = (unsigned long)((short*)array + 2019) - (unsigned long)(array + *(unsigned char*)(array + 19)); cout << offset; }
以上程序的输出是多少?
仔细一看,这里面各种指针操作,让人一眼看去就有放弃的冲动。其实不急,按照一层一层的剥丝抽茧,其实也不是那么难。
首先,对于((short*)array+2019)
中,是把array
指针由int
型指针强制转换为short
型指针,再偏移2019个单位。short
型占2个字节,因而在地址上的偏移量就是2019 * 2 = 4038
;
然后,对于后面的*(unsigned char*)(array + 19)
进行分解:1、array+19
对应得是array[19]
的地址,这个地址存储的数为2019,其写成16进制为0x000007E3
,而(unsigned char*)(array + 19)