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;