首先看一个例子。
首先确认一点:a的类型为5个元素的int数组,其类型可以看作是int[5],虽然不存在这种类型,但是这么理解是没有问题的。
C/C++中指针和数字的运算是将指针按照其类型大小进行前后移动相应个数的字节数。如int类型大小(sizeof值)为4,char为1。 比如,int p; char q; p+1;就是将p的值(内存地址)加4(int类型的字节数),q+1则是将q的值加1(char类型的字节数)。
所以,题目中 &a+1 的意思就是将a的地址加上5个int的字节数,因为a的类型为int[5],然后将结果强制类型转换为 int *后赋值给p。
可是,a的地址又是什么呢? a的类型为int[5],所以,a的地址是指向了5个int类型元素的首地址,它的sizeof值是4*5=20,所以 &a+1 就是数组a最后一个元素后面的20个字节的首地址。
强制类型转换后,变成数组后面一个int空间的首地址。 所以,最后p-1就是数组最后一个int空间的首地址,*(p-1)就是数组最后一个元素了。
总之,类型只是标记内存读写的方式,或者说是内存分配的方式。而指针作为一种可以与内存地址等价的存在,其算术运算必须要结合类型的sizeof值。
所以,本题应该选择什么呢?
网友评论