
首先,这个问题完全不符合编程实际需求,但是各种考试都会出现,也有助于理解指针和数组的关系。
先看题目:
int main(){
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*ptr)[3]=a,*p=a[0];
}
定义一个二维数组:

int (*ptr)[3]=a:
定义一个数组指针(即指向数组的指针),赋初值为a,即ptr指向a数组首地址,指向的是有三个int的数组,即a数组的每一行。
*p=a[0]:
定义一个指针指向a数组的第一行的首地址,也是数组的首地址,但是只指向一个int

三者指向的单元相同,但是操作时不同,如:
p+1:p后移一个单位
ptr+1:ptr后移一个单位,一个单位包含三个int,所以指向第二行行首
a+1:以a为基准后移一个单位,也指向第二行行首

看选项:
a.*((*ptr+1)[2])
一步一步看,*ptr:给ptr解引用,还是指向第一个单元,但单位已变为一个int,
+1:后移一位,现在指向值为2的单元
[2]:以当前单元为0号,2号即向后索引到第三个单元,此时值为4
*:当前已经是值了。再解引用发生错误,没有这一步结果即为4

b.*(*(p+5))
p+5:p后移五个单位,指向值为6的单元
*:解引用,此时值为6
*:与a选项相同,会报错
c,d同理分析
c:ptr解引用后后移三个单位,指向值为4的单元(不是值)
d:先移到第二行行首,再解引用,后移两个单位,再解引用,值为6
正确答案为d
总结:
1.想要表示值,解引用次数一定与原指针类型对应,ptr想要表示值,需解两次引用,p则只需一次
2.解一次引用表示降一个维度,ptr每次+1后移一行,ptr解一次引用后,变为指向一个单元,每次+1后移一格
3.a[2]这种表示也可视作一次解引用,a+2和a[2]都指向a数组第三行行首,但是第二种表示后续操作时以一个int为一个单位。
这块确实比较乱,配合画图理解更佳,另本文若有错误之处,欢迎指正。
理解C语言中指针与数组的关系
356

被折叠的 条评论
为什么被折叠?



