&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。该表达式的评估方式如下:

  1. a是由3个int组成的3个数组。 a的元素是a[0]a[1]a[2]
  2. 在表达式a中使用a+2时,a将自动转换为指向其第一个元素的指针。因此,a成为&a[0]的指针,指向a[0]
  3. 通过为指针定义+,将2添加到指向a[0]的指针会生成指向a[2]的指针。所以a+2&a[2]
  4. 然后*(a+2)a+2指向的对象,因此它是a[2]
  5. 所以*(a+2)+3a[2]+3
  6. a[2]是3 int的数组。它的元素是a[2][0]a[2][1]a[2][2]
  7. 在表达式a[2]+3中,a[2]自动转换为指向其第一个元素的指针。因此a[2]变成&a[2][0],表达式是&a[2][0] + 3
  8. 通过为指针定义+,将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为您提供了一个指针值,而不是整数值。