大家先看一个题目(今天做的时候被小小的坑到了)
求这个程序的运行结果
#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; }
应该有不少人会认为答案是0 0 0 0 5(也可能我太菜)。
首先明确数组在内存中所占的空间是有顺序的,在用指针修改数据的时候必须逐个修改,不能跨越。
这个就是题目中数组的存储方式。又因为指针类型是short*,所以*p在第一个循环中每次只能修改两个字节。
故改变之后,数组中内容如下: | |
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 |