二维数组为什么不会继续退化

8 篇文章 0 订阅
int*monthp)[31]为什么无法转换为int **  

一般解释(类型不同,其存储方式不同) 二维数组需要数组指针来指向,它还保存着指向数组的元素个数,而二级指针指向数组将元素全丢了,就像声明时为什么二维数组不能省略列一样,行代表了元素个数(可以计算出来),列代表了元素里拥有的个数。但是按这种理解,二维数组为什么不能像一维数组一样靠丢失元素个数,然后在传参的时候传入行和列来换取节省的空间和时间上的花销呢?为什么编译器提醒两者之间无法进行转换呢?

假设局部变量在内存中是连续的,同时假设指针在内存中也是连续的。

double a0,a1,a2,a3;
double *p0,*p1,*p2,*p3;//假设指针在内存中也是连续的。

double **s=p0;

//假设s每次操作后都指惠p0,p0每次操作后都指惠a0
//s+1 -》s指向p1 变化4字节
//*s+1 -》p指向a1 变化8字节
//**s+1-》a0+1

在这里插入图片描述

在这里插入图片描述

如图,若存在指针int**s s指向ar0时 s+1是否能指向ar1?
不可以,虽然s是二级指针,但s指向的是一级指针,其解析能力还是4字节,而要指向ar1需要16字节的偏移

而 int (*s)[4]= &ar0; s指向ar0时, s+1是否可以指向ar1?
可以,s指向的是一个数组,而该数组大小就是16字节。所以s+1相当于指向下一个数组的首地址。所以要死该数组还能继续退化,那么解析能力都将出现问题。这也是为什么其不能继续退化二级指针的原因。

int ar[10]{12,23,34,45};//ar是一个是一个有着10个元素的数组,其元素的类型为int
int *p[10];//因为优先级相当于int *(p[10]) ,所以p是一个有着10个元素的数组,其元素类型为int *
int (*s)[10];//s为指针,s是指向了一个拥有10个元素的数组,数组的元素类型为int的指针

return 0;

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值