结论
二维数组名是数组指针,其操作方式可以类似于二级指针进行操作,但是其不能等同于二级指针!
下面我将从**地址**的方向进行一个分析j记录:其它详情这个链接中分析的特别好:
链接: https://blog.csdn.net/c46550/article/details/90324984
分析
对于二级指针
//定义一个二级指针,并分配空间
int **p = (int **)malloc(sizeof(int *) * 4);
printf("%p\r\n%p\r\n%p\r\n%p", p, p[0], *p, *(p + 0));
//可知p是二级指针,p[0]=*p=*(p+0)是一级指针,所以其打印出来的地址应该是如下情况:
//p的地址和p[0]=*p=*(p+0)的地址是不相同的,而p[0]=*p=*(p+0)的地址是相同的:
打印结果如下图:与分析的一致
对于二维数组
//定义一个二维数组
int zpo[4][2] = {{2, 7}, {8, 6}, {5, 8}, {1, 3}};
printf("%p\r\n%p\r\n%p\r\n%p", zpo, zpo[0], *zpo, *(zpo + 0));
//则zpo是二维数组名,为数组指针,是一级指针,则对于其地址而言:zpo,zpo[0],*zpo,*(zpo+0)地址均应该相同:
//至于为什么可以细看数组指针:
打印结果如下图:与分析的一致
对于一维数组
一维数组而言,其数组名也可以类似于一级指针来用但是也是有区别的:
//例如定义:
int *p;
int num[5];
//我们可以p++但是不能num++
//对于其使用,则p+i于num+i是等价的
//num的地址等于于&num[0],不等于num[0]
//这也说明了二维数组名不是二级指针,只是操作上几乎与二级指针等价
我们可以p++但是不能num++,对于其使用,则p+i于num+i是等价的。num的地址等于于&num[0],不等于num[0]。
这也说明了二维数组名不是二级指针,只是操作上几乎与二级指针等价*
最后关于二维数组名的为什么是这样我还没有完全搞清楚,写这个是为了整理一下发现的问题和结论,做一个记录: