只是为了推动点回家,阵列不指针。当你声明numbers为int numbers[10],你在内存中的以下内容:
+---+
numbers: | | numbers[0]
+---+
| | numbers[1]
+---+
...
+---+
| | numbers[9]
+---+
有没有存储为一个单独的指针的numbers第一要素搁置。所发生的是,当表达numbers的任何地方出现,而且它不是的sizeof或一元&运营商的操作数,它被转换(“衰变”),以类型的表达式“指针int”,并且该值的表达式是数组的第一个元素的地址。
你与pn做的是将其设置为指向的numbers的第一要素,然后再“走”到数组:
+---+
numbers: | |
+---+ |
| | |
+---+ |
... |
+---+ |
| | |
+---+ |
... |
|
+---+ |
pn: | | -------+
+---+
表达pn++进步pn指向下一个整数对象,在这种情况下是所述数组的下一个元素:
+---+
numbers: | |
+---+
| |
+---+ |
... |
+---+ |
| | |
+---+ |
... |
|
+---+ |
pn: | | -------+
+---+
每个pn++前进指针,直到在第一循环结束,则有以下几种:
+---+
numbers: | |
+---+
| |
+---+
...
+---+
| |
+---+
...
|
+---+ |
pn: | | -------+
+---+
此时,pn所指向的对象立即阵列的端部以下。这就是为什么你必须在下一个循环之前重置pn;否则你走通过内存紧跟numbers,它可以包含相当多的东西,包括陷阱表示(即不符合合法值给定类型,即比特模式)。
尝试访问内存大于一个过去的数组的末尾调用未定义行为,这可能意味着从你的代码直接轰然显示垃圾按预期工作的事情。