求解答谢谢
2 回答
已采纳
凌小天3635910
TA贡献17条经验 获得超13个赞
int a[]={5,15,34,54,12,2,52,72}; //创建一个整形数组,大小为8个整形 int *p=&a[5]; //创建一个指针变量p,将数组a的第六个值所在的地址赋值给p,*p=2 printf("%d",*p[-2]); //p[-2]等价于(p+(-2)),此时指向p地址向前数两位的a[3]。值为54.
快乐的时光
TA贡献79条经验 获得超48个赞
如果你在你的程序里再有下面的定义语句的话 int *p=&a[3]; 那你使用 p[-2]就完全没问题了,因为它表示 a[1].
如果你定义了一个数组后,比如 int a[5]; 在内存中会为这个数组分配5个存储单元,此时如果你用这5个单元是完全没问题的,因为这5个已经被你申请了,而其他没被申请的单元是不能随便用的,比如 a[-2]是表示 a[0]前的两个单元(每个大小编译系统会根据你声明的数组元素的类型确定,在这个问题中每个单元都是 int型的),如果碰巧这个单元没被分配给其他变量时你使用会没有问题,但是如果已经被其他变量占据,那此时你使用就会出现问题,所以书上要求不能为负的是正确的,你的使用没问题是巧合。即使偶尔可以使用,也不要这样做,第一这样做没什么意义,第二会使程序存在潜在的隐患。
- 2 回答
- 0 关注
- 1383 浏览
添加回答
举报
0/150
提交
取消