OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1813|回复: 2

*(a+1)+2表示1行2列元素a[1][2]的地址,怎么看出来呢?

[复制链接]

163

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1214
金钱
1214
注册时间
2016-5-19
在线时间
297 小时
发表于 2018-7-7 18:02:43 | 显示全部楼层 |阅读模式
1金钱
问个基础问题
*(a+1)+2表示1行2列元素a[1][2]的地址,怎么看出来呢?
我不明白*(a+1)+2为什么表示的是地址.

*(a+1)+2
*(a+1)其中a表示整个数组首地址,指向对象是行,所以a+1表示第二行首地址就是a[1]
而*(a+1)就表示a[1],这个我知道.

我的疑问是a+1既然是第二行首址,*(a+1)为什么不能看成第二行内容.

最佳答案

查看完整内容[请看2#楼]

假设a[M][N]表示一个大小为M*N的二维数组。 *(a+1)取的是a[1][0]的地址,而不是a[1][0]的值, 想要获得a[1][0]的值,则需要写成*(*(a+1)),因为是二维数组,所以需要取两次*才能获得值。 *(a+1)取的是a[1][0]的地址,那么这个地址再加2,【*(a+1)+2】:就是a[1][2]的地址, 也可以用&a[1][2]来表示,后面这种表示方式就好理解多了,哈哈。 【*(*(a+1)+2)】:是a[1][2]的值; 更大维度的情况以此类推。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-7 18:02:44 | 显示全部楼层
本帖最后由 warship 于 2018-7-7 19:30 编辑

假设a[M][N]表示一个大小为M*N的二维数组。
*(a+1)取的是a[1][0]的地址,而不是a[1][0]的值,
想要获得a[1][0]的值,则需要写成*(*(a+1)),因为是二维数组,所以需要取两次*才能获得值。
*(a+1)取的是a[1][0]的地址,那么这个地址再加2,【*(a+1)+2】:就是a[1][2]的地址,
也可以用&a[1][2]来表示,后面这种表示方式就好理解多了,哈哈。
【*(*(a+1)+2)】:是a[1][2]的值;
更大维度的情况以此类推。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-7-7 19:25:27 | 显示全部楼层
本帖最后由 warship 于 2018-7-7 19:34 编辑

真要理解的话,可以这样解释:
首先看一维数组的情况, int a[5], 你知道a可以代表这个数组的地址也是第一个元素a[0]的地址, a+1是第二个元素a[1]的地址,所以*(a+1)就可以得到第二个元素的值(其值是一个int整数)
推广到二维数组int a[5][4], 我们采取降维的方式,把它当作一个一维数组,即同样是a[5],但是已经不是int a[5]了,而是int *a[5];
它的每一个元素都是一个指向int[4]的指针!!!
按照一维数组来看待它,则a+1是它的第二个元素的地址,所以*(a+1)就可以得到第二个元素的值(但其值是一个指针),即得到了一个指向第二行的一个int[4]的指针,即第二行的指针,也就是第二行的首地址,
所以  *(a+1)等于第二行的首地址,这个地址+2是第二行第三列的地址,即a[1][2]的地址,而不是内容。

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-16 11:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表