指针问题1

#include <stdio.h> void main () { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&

#include <stdio.h>
void main ()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf ("%d,%d\n\n",*(a+1),*(ptr-1));
}
 

这题的关键在int *ptr=(int *)(&a+1);这一句上,&a表示取得数组a存储区域的首地址,再加1表示数组a存储区域的后的地址,这就使得ptr指针指向数组的最后一个元素后面的那个存储单元的地址,而ptr减1后,再进行数据访问,则访问的是ptr指针的前一个存储单元的值,所有最后的答案是2,5

看一道题:
int array[5]={1,2,3,4,5};
cout<<*(*(&array+1)-1);
会输出什么?

这道题答案是5。

解析:

*(*(&array+1)-1)里,
&array是取array的地址;
&array+1就是在array的地址的基础上向前跑4*5个字节;
*(&array+1)就是在数组末尾再往后一个字节的地址;
*(&array+1)-1就是数组末尾的地址;
*(*(&array+1)-1)就是数组末尾的那个元素。
 

猜你喜欢

转载自blog.csdn.net/ll148305879/article/details/92796252