指针和数组笔试题解析T3_C语言笔试题详解

今日份练习“指针和数组”试题练习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;
}

尝试自己先理解一下,在图上画一画。

👇

👇

👇

指针和数组笔试题解析T3_C语言笔试题详解_02

✨答案是:"FFFFFFFC"和"-4"✨

解析:

对于这种二维数组的指针笔试题,最好的解题方式就是画图。

1.int arr[5][5];先画出二维数组arr的抽象图

指针和数组笔试题解析T3_C语言笔试题详解_03

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只跳过四个整型

指针和数组笔试题解析T3_C语言笔试题详解_04

p+4的地址解引用进入该数组内部,且再+2就是跳两个整型

指针和数组笔试题解析T3_C语言笔试题详解_05

则以上就是&p[4][2]的地址

&arr[4][2]的地址为:指针和数组笔试题解析T3_C语言笔试题详解_06

&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的十六进制的地址形式进行打印:指针和数组笔试题解析T3_C语言笔试题详解_07

且-4为整型占四个字节,则结果为FFFFFFFC

敬请期待下一题~

😃你学废了嘛?

指针和数组笔试题解析T3_C语言笔试题详解_08