作为一个单选题,这题的AB选项你都没排除掉,这个学得不是一般的薄弱啊。。。
来看a,这是一个二维数组,a本身就是一个行指针,指向二维数组的第一行。p呢,他被定义为是一个指向整型数组的指针,也就是行指针,所以p=a;赋值没有问题。于是p指向了这个二维数组的第一行。我们先理清楚层次关系,来分个层,从上到下是行指针 -> 列指针(指向元素) -> 元素值,&和*是两个相反的东西,比如int num=5;int *ptr;ptr=#
num是一个元素,直接打印num就是元素值了,&num就想上一层,将其赋值给ptr,ptr就是指向元素的指针,如何取元素值呢,就得向下一层,所以*ptr就是元素值,也就是5.
然后还有一个东西需要了解,就是p[x],他的实质是*(p+x),也就是说p[x]和*(p+x)是完全一样的。ok,现在回到你的问题,很明显A和B就是完全一样的了。出于做这种单选题,AB直接就排除了,不过还是来看一下这是个啥吧。刚说了p是一个行指针,那么给它加个*号,它就变成了列指针,也就是指向元素了对吧,看似没有问题,不过再加*之前p加了2,这是个什么概念?p是一个行指针,指向了二维数组的第一行,p每加1就指向下一行,这里加了2,所以他指向了第三行,也就是说AB答案其实是指向了第三行第一个元素,而这里一共只有两行,所以已经不是a数组元素了。再来看C,p[1]=*(p+1),p+1就指向了第二行,再加个*号,指向了第二行第一个元素,再加1指向了第二行第二个元素,于是你可以看到上面图中输出了5(第二行第二个元素就是5嘛)。再看D,请问它和p+3有什么区别?刚才已经说过了,p每加1,就指向了下一行,这里加了3,而且没有出现*号,所以整体依然是一个行指针,并且指向了第四行。最后为了验证解释是没有问题的,我弄一个有4行的a数组,按照刚才解释,AB答案指向了第三行第一个元素,在AB答案之前加个*就是第三行第一个元素值了吧,所以下图第一二行都输出了7。答案C指向了第二行第二个元素,所以第三行输出了5。答案D刚才说了是一个行指针,指向了第四行,我们先加一个*号,让它指向第四行第一个元素,再加一个*号,让它取第四行第一个元素的值,所以第四行输出了10。
我这个概念有点多,而且一般书上可能还没有我这些概念,一时可能难以接受,用心去体会。
好像没刷新。。。更正一下,p+2指向了第三行,AB答案指向了第三行第一个元素,在AB答案前加个*号就是取第三行第一个元素值