下面代码的结果是:( )
#include <stdio.h> int main() { int arr[] = {1,2,3,4,5}; short *p = (short*)arr; int i = 0; for(i=0; i<4; i++) { *(p+i) = 0; } for(i=0; i<5; i++) { printf("%d ", arr[i]); } return 0; }
解答:
注意:1)指针加减——首先将所存储的内容转化为十六进制形式-2*4的形式-4个字节!
然后再看指针类型-int则一次4字节,char一次1个字节
2) 十六进制中 从右至左读取是高位到低位! 改变先从低位开始 两个数字表示一个字节!!
注意存储写法!!-倒
arr数组在内存中的存储格式为:
1 0x00ECFBF4: 01 00 00 00 //实际表示的十六进制:00 00 00 01
2 0x00ECFBF8: 02 00 00 00
3 0x00ECFBFC: 03 00 00 00
4 0x00ECFC00: 04 00 00 00
5 0x00ECFC04: 05 00 00 00
指针p的类型为short*类型的,因此p每次只能移动两个字节,for循环对数组中内容进行修改时,一次访问的是:
arr[0]的低两个字节,arr[0]的高两个字节,arr[1]的低两个字节,arr[1]的高两个字节,故改变之后,数组中内容如下:
0x00ECFBF4: 00 00 00 00
0x00ECFBF8: 00 00 00 00
0x00ECFBFC: 03 00 00 00
0x00ECFC00: 04 00 00 00
0x00ECFC04: 05 00 00 00
故最后打印:0 0 3 4 5
答案: 0 0 3 4 5
总结:指针加减:一定要先转换到十六进制位-再看指针类型进行移动赋值
疑问:改变的明明是P 为什么arr数组同样会改变?
--短整型指针p指向数组arr!!