【基础】二维数组名 != 二级指针

二维数组名 != 二级指针

结论

二维数组名是数组指针,其操作方式可以类似于二级指针进行操作,但是其不能等同于二级指针!
下面我将从**地址**的方向进行一个分析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]。
这也说明了二维数组名不是二级指针,只是操作上几乎与二级指针等价
*

最后关于二维数组名的为什么是这样我还没有完全搞清楚,写这个是为了整理一下发现的问题和结论,做一个记录:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值