二维数组与指针问题探究

 

 首先,这个问题完全不符合编程实际需求,但是各种考试都会出现,也有助于理解指针和数组的关系。

先看题目:

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为一个单位。

这块确实比较乱,配合画图理解更佳,另本文若有错误之处,欢迎指正。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rvp-age

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值