实验室面试的一个题,希望得到解答

若定义char s[2][3]={“ab”, “cd”}, *p=(char *)s;那么下列表达式语法正确,并且其值与 s[1][1]相等的表达式(并非一定与其等价)是
A. *(s+3)
B. p[1][1]
C. *(p+3)
D. *++P+2

B
其他的都是 s[1][0]

先上结果,

img


img

这个你要想深究咱们私信聊,你要简单的说,你看一下我下面的回答
A的话,首先,你把二维数组想成一个表格,然后二维数组名当指针用的时候 s++,代表的是行数加一,但是要提一下的是,计算机在处理数组的时候,是把数组当指针看,比方说一维数组在处理a[1]时,就是将指针从数组的首地址向后移动一个单位长度,而数组的数组(二维数组、三维数组等),则被处理为数组的指针,比方说a[ ][3],这个a做指针的时候指向的就是一个三个单位长度的数组,相当于一个二级指针类似于

img

(你要拿a当指针用的话)
所以二维数组的名称你可以当作一个二级指针来理解(但实际上这个理解问题很多,但是这道题这么想算个技巧吧),所以A当你s+3的时候实际上指向的是第四行,但是你这个二维数组只有两行,但就算你写s+1也是输出不出来的,因为刚叫你把他看成二级指针,所以*(s+1)实际上是一个地址,得不到值,修改的话你可以改成**(s+1),这样能输出值,但只能输出第一列的值哦

再看B,为什么写了之后编译器都通过不了呢,你看p[1][1] 你可以这么理解,如果p[1][1]可以说明是p一个二维数组的名称,那上面说到二维数组名是二级指针而题目中p实际上是一级指针,这里互相矛盾,所以编译出错

再看C,p是一个一级指针,然后你将s强转成一级指针赋给p,那p现在指向哪里呢?是不是还是数组的第一个元素a,这时候你的p就是a,然后你(p+3)就是将指针向后移动三位,也就是c的位置(二维数组在电脑中存储的方式是连续的),所以c也不选

再看D,你看++p就相当于p = p+1,所以这里*++p实际上就指向的是第二个位置(b),然后b+2不就是d了嘛(ascii码),所以就是题目上说的值相同,并非等价,所以我觉得选D

以上就是我个人的看法,如果你想深究,我们可以私聊探讨,不过兄弟你学校这实验室这题确实有难度,我今老老实实看了一天(昨天就看到你这个问题了但是没解决),被按在地上摩擦,祝你平安,哈哈哈哈,加油,相信你尽量能看懂,如果看不懂的话我们接着探讨,当然不一定对啊,我就是说一下我个人观点