如何解决&a [i] [j]如何计算为*a + i+ j
a [3] [3] = {1,2,3,4,5,6,7,8,9};
如果我想使用*(a + i)+ j来获取a [2] [3]的地址
根据我的说法,*(a + 2)将给我3(考虑行顺序),并且j = 3,因此它的值为3 + 3 = 6
它将如何给地址?
解决方法
您显然知道,&a[2][3]
被定义为*(a+2)+3
。该表达式的评估方式如下:
-
a
是由3个int
组成的3个数组。a
的元素是a[0]
,a[1]
和a[2]
。 - 在表达式
a
中使用a+2
时,a
将自动转换为指向其第一个元素的指针。因此,a
成为&a[0]
的指针,指向a[0]
。 - 通过为指针定义
+
,将2
添加到指向a[0]
的指针会生成指向a[2]
的指针。所以a+2
是&a[2]
。 - 然后
*(a+2)
是a+2
指向的对象,因此它是a[2]
。 - 所以
*(a+2)+3
是a[2]+3
。 -
a[2]
是3int
的数组。它的元素是a[2][0]
,a[2][1]
和a[2][2]
。 - 在表达式
a[2]+3
中,a[2]
自动转换为指向其第一个元素的指针。因此a[2]
变成&a[2][0]
,表达式是&a[2][0] + 3
。 - 通过为指针定义
+
,将3
添加到指向a[2][0]
的指针将产生指向a[2][3]
的指针。没有元素a[2][3]
,但是指针算术可以超出数组的末尾,尽管那里没有定义的元素,但是您可以使用该指针作为端点,并且不应该取消引用指针。
因此*(a+2)+3
给出的地址刚好超出子数组a[2]
的末尾。
只需删除 j(3)并将 3 添加到 i 。无需添加 j 。 * a是数组的第一个元素的地址。 ** a = 1,因此* a + 2表示您将 2 添加到第一个元素的地址,它成为第三个元素的地址。 * ( a +5) 是 a [2] [3] 的地址。您的分配也应为 a [ 3] [3] = {{1,2,3},{4,5,6},{7,8,9}};
,简单-如果
a[i] == *(a + i)
然后
a[i][j] == *(a[i] + j) == *(*(a + i) + j)
因此
&a[i][j] == *(a + i) + j
表达式 a[i]
的类型为“ int
的3元素数组”。除非它是sizeof
或一元&
运算符的操作数,否则它将被转换或“衰减”以键入“指向int
的指针”或int *
。因此a[i] + j
为您提供了一个指针值,而不是整数值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。