首页 > 试题广场 >

#include int c[3][4]; ...

[不定项选择题]
#include<stdio.h>
int c[3][4];
int (*p)[4];
p=c;
以下能够获取c[1][3]值的是()
  • *(*(p+1)+3)
  • *((int *)p+7)
  • *(p[1]+3)
  • *(p+1)+3
c表示的是3X4的数组
      p  -->  O    O    O    O
                O    O    O    O  <----  c[1][3]
                O    O    O    O

p是行指针
对选项A:
p+1指向第二行, *(p+1)就表示p[1]
发表于 2020-10-08 15:09:22 回复(0)
AC没啥讲的,B为什么要转成Int*,二维数组的本质还是一位数组,从p,a[0][0]到a[1][3]所跨越的刚好是7个整型长度。为啥是7个?第二行第四列。D明显没有解引用
发表于 2020-08-13 08:09:03 回复(1)
p是指向“整型数组”的指针,所以+7的那个选项还需要对它进行强制转换~
发表于 2020-08-08 15:18:04 回复(0)
我发表一下对B选项的见解, 先理解这一句:我们都知道除了空指针以外没有确切的指向类型,其他我们自己定义的指针都有确切的指向类型。 比如int *c,那么c就是指向int类型的。 第一步:刚刚开始的时候a和p都是指向四个int类型的数组。跟题中p刚刚定义时,int (*p)[4];,指向的类型是一样的, 并且p+1和a+1都是移动4个整型(int)大小的字节,都是16。 第二步: 发生了强制类型转换(int*)p,把p指向的四个int类型数组强制转换成了指向int类型,这个时候(int*)p+1是移动1个整(int)大小的字节,而a+1还是16个字节。 所以 *((int*)p + 7) 是(int*)p指针加7先移动到c[1][3]这个地方的地址,然后再解引用,得到c[1][3]的元素。 拓展:理解为啥要先int (*p)[4];而后 p = a;,而不是int (*p)[3];而后 p = a;,我试了后者,直接报错。 大家有兴趣的试试,我在这里就不多说了。毕竟学编程不只是动脑子还要动手。
发表于 2022-01-02 00:30:30 回复(0)
int c[3][4]表示 3行4列的二维数组
p=c;那么p和c都指向了这个二维数组
A:
*(*(p+1)+3)
*(p+1)是p指针+1再取值,这个1就是加的下标, 等价于 p[0+1],获取行指针(一维指针),因为是二维数组,一维取值出来的还是一个指针(指向第二个维度(列)的指针),同样的+3表示 “p[1][0+3]”,就是“p[1][3]”这个指针,然后对他*获取值
B:
*((int *)p+7)
(int *) p 我是这么理解的,分两步,第一步把p强转为int就是首地址,再把这个首地址转为指针,这个指针就是指向实际值的指针(这时候可以理解为一维数组了,p[3][4],看成一维数组p[12]),那么现在对指针+7就是p[0+7]=p[7],从二维数组看,第七个数是多少?一行4个数,不就是第二行的第三个数就是c[1][3]这个数了
C:
*(p[1]+3)
p+3表示行维度+3就是p[0+3],p[1]+3表示列维度加3就是p[1][0+3],然后对这个指针解引用就是p[1][3]就是c[1][3]的值
D:
*(p+1)+3
参考A,没有解引用,打印出来是地址

所以答案是ABC

发表于 2022-08-12 10:53:18 回复(0)
指针转化为数组小标
A  p[1][3]
B p转化为一级指针,加7就是p+7*4,然后取星
C p[1][3]
D p[1]+3
发表于 2021-10-09 10:26:33 回复(0)
二维数组本身就是一维数组,强制转化后加上偏移量7刚好就是c[1][3]
发表于 2020-08-20 13:54:53 回复(1)
AC很容易看出来,二维数组名相当于二级指针。b选项将二级指针强转,步长为4 往后读7个即可
发表于 2022-07-05 04:09:09 回复(0)
p[1]等价于*(p+1)
发表于 2022-01-06 15:06:03 回复(0)
把二维数组转换成一维数组。
发表于 2020-08-19 11:18:34 回复(0)
p=c 二维数组c在表达式中 转化为int(*)[4]就是指向C数组的第一行的元素。 c数组又赋值给了p,所以他俩指向了同一个数组。 原本都为int(*)[4]类型的指针,指向的是第一行的元素。 然后(int*)p将int(*)[4]变为了 int[4]类型的数组 p此时为int[4]类型的数组 出现在p+7的表达式中, p就转变为了int(*)类型的指针 p+7此时就向后移动,指向后面的元素,此时指向了c[1][3]这个元素 此时p+7为int(*)类型的指针,*(p+7)后就转变为了int类型的。 指向了c[1][3]这个元素,类型是int类型,可以取到c[1][3]的值。
发表于 2023-10-08 09:02:18 回复(1)
*(p+1)=p[0]
发表于 2023-10-19 19:15:38 回复(0)
b选项,本来p是int [4]*型的,但是b中强行转换成int *型
发表于 2022-12-17 11:48:14 回复(0)
p[1]等价于*(p+1)
二维数组本身就是一维数组,强制转化后加上偏移量7刚好就是c[1][3]
发表于 2022-05-06 18:29:39 回复(0)
是这样吗?
发表于 2022-02-02 11:59:41 回复(0)
a00到a13所跨越刚好是七个长度
发表于 2022-01-23 15:28:02 回复(0)
D只是取到了地址,没有取到里面的值
发表于 2022-01-20 22:55:53 回复(0)
[]的优先级>*; Int (*p)[4]表示p是指向int类型数组的指针;
发表于 2021-08-03 16:05:57 回复(0)