如何将指针算法与解引用和加法一起使用?

时间:2019-02-12 20:29:18

标签: c arrays pointers math

我刚刚参加了计算机科学课的考试。在考试中,有一个二维int数组,我们被要求计算值。我以为我理解指针算术,但我误解了一半,所以我希望这里的人可以更好地解释它。

我已经看了几个Youtube视频,看了多个不同的演讲幻灯片/笔记,当它是二维数组时,在理解这一概念时仍然遇到困难,我理解是一维的。

int a [2] [3] = {{30,40,50},{60,70,80}};
显示以下结果:
1. a =
2. a [0] =
3. a + 1 =
4. a [0] [0] + 1 =
5. * a [0] +1 =
6. *(a [0] +1)=
我们假定地址从0x100开始。

我给出了以下答案:
1. a = 0x100
2. a [0] = 0x100。
3. a + 1 = 0x112。
4. a [0] [0] +1 = 0x112。
5. * a [0] +1 = 11.
6. *(a [0] +1)= 0x104。
................................................... ......................
我得到3分半信用,分别是3分,4分错和6分错。 如果我现在可以更改答案,我不知道为什么3错误了,也不知道为什么4错误了,我相信6就是40。

1 个答案:

答案 0 :(得分:1)

“ 3。 a + 1 = 0x112”错误:

  • a的大小为0x100。 a的元素是三个int的数组。 int是四个字节,所以三个int是12个字节,因此a的元素是12个字节。因此,a+1a之后的一个元素,为0x100 + 12 = 0x10c。

“ 4。 a [0] [0] +1 = 0x112”错误:

  • a[0][0]是30。30+ 1是31。

“ 6。 *(a [0] + 1)= 0x104”错误:

  • a[0]a的第一个元素,因此它是三个int的数组,包含30、40和50。作为一般表达式中的数组,它会自动转换指向它的第一个元素的指针,因此它指向30。加1会得到一个指向下一个元素的指针,因此a[0]+1是指向40的指针。然后用*对其进行解引用会产生40。 / li>