今日份练习“指针和数组”试题练习3
前言:
该题主要考察二维数组,以及数组指针的访问权限和指针计算。
T3:
#include<stdio.h>
int main()
{
int arr[5][5];
int(*p)[4];
p=arr;
printf("%p\n",&p[4][2]-&arr[4][2]);
printf("%d\n",&p[4][2]-&arr[4][2]);
return 0;
}
尝试自己先理解一下,在图上画一画。
✨
揭
👇
晓
👇
答
👇
案
✨
✨答案是:"FFFFFFFC"和"-4"✨
解析:
对于这种二维数组的指针笔试题,最好的解题方式就是画图。
1.int arr[5][5];
先画出二维数组arr的抽象图
2.int(*p)[4];
//这是一个数组指针
3.p=arr;
将数组arr的首元素地址赋予了数组指针p
注意:①arr是一个二维数组,且二维数组的首元素地址代表的是整行的地址,且arr[0]该行数组的地址赋给了数组指针p
②数组指针p初始化的时候只能指定四个整型
4.printf("%d\n",&p[4][2]-&arr[4][2]);
p[4][2]等价于*(*(p+4)+2)按照优先级,先计算括号内的p+4。
因为此时的数组指针p是存放代表arr[0]该数组的地址,且p的访问权限只有四个整数,则p+1只跳过四个整型
p+4的地址解引用进入该数组内部,且再+2就是跳两个整型
则以上就是&p[4][2]
的地址
且&arr[4][2]
的地址为:
将&p[4][2]-&arr[4][2]
的地址
(指针减法运算的结果为地址值的差再除以该地址数据类型的大小)
从图上很明显的能看出来这两个地址之间相差了4个整型的地址,很明显小地址处减去大地址处,则得到的结果为负数,且他们相差4个整型,则结果为-4
5.printf("%p\n",&p[4][2]-&arr[4][2]);
该打印方式是以地址形式进行打印的,我们知道&p[4][2]-&arr[4][2]
的结果为-4,将-4的十六进制的地址形式进行打印:
且-4为整型占四个字节,则结果为FFFFFFFC
敬请期待下一题~
😃你学废了嘛?