1 #include "stdio.h" 2 3 int main() 4 { 5 int a[5]={1,2,3,4,5}; 6 int *ptr=(int *)(&a+1); 7 printf("%d %d\r\n",*(a+1),*(ptr-1)); 8 }
输出结果为: 2 5
打印的第一个数好理解,就是打印的数组首地址加一后的数,就是a+1,打印的是2;
打印的第二个数为什么是5呢?下面好好说一下:
首先我们知道,C语言中的指针"+1",加的长度都是其类型的长度,比如 char 型,这个类型指针加一,所加的就是 1 个字节的长度,而 int 型所加的就是 4 个字节的长度,好,现在再来看上面的代码,我所定义的数组是 “int a[5]”,这是一个长度为5的数组,下面的 printf 中,第二个打印的为什么是5呢?那时因为 “ptr”指针所存放是"数组地址",是这个长度为5的数组的地址!换句话说,这是一个长度为“5个int型数据”的“类型”,他的指针加1,所加的是整个数组的长度!它加的是5,是5*4(int型4个字节)=20个字节的长度!所以这加1,其实直接加到了数组第5位元素,但是如果这是我们就这样打印ptr里面的内容,其实得到的是内存随机值,因为数组下标最大是4,而现在直接加到5了,所以应该再减1,这样才不会超出数组,这是减一后打印的数刚好就是5,减2就是4。。。。。
下面总结一下最重要的结论:"数组下标加1"和"对数组取地址后加1"是不同的!数组下标直接加1,就是简单的从第一个元素的地址开始,往后加相应的1个地址,而如果对数组名取地址,这是加的就不是单单的往后加一个地址了,这时其实取的是数组的地址,这时的指针所加的也是整个数组的长度!