int *ptr=(int *)(&a+1) 与int a[5]={1,2,3,4,5} 指针的变动
来源:互联网 发布:java scheduler 编辑:程序博客网 时间:2024/05/16 11:20
今天看了一段有关数组与指针的代码,里面的一些问题始终无法还有些解不开。
代码如下:
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
运行结果如下:显示2 和5
在进行GDB调试的时候 P(&a+1) 显示的结果是 int (*)[5] 有点糊涂了,&a 数组a[5] 的首地址,*(a+1)是代表第二个元素的地址,那么(&a+1)又指向了哪里?
按结果显示应该是指向了a[5]的第五个元素的的地址,即a[4] 的地址了,为何?? 奇怪的还在后面
继续调试 显示 ptr 的结果是 int*, 而*(a+1)显示的是2(这个好理解是正确的),*ptr 的结果是 -1073748128
接着 *(ptr-1) 显示的是5 ,数组和指针的没弄明白。
在书上给 出了这样一个解释,提到&(a+1)指的是下一个数组的首地址,并且已经越过了数组的界限,还是有些似懂非懂的感觉,希望后面能够彻底顿悟数组与指针的内容。
&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的
首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一
个数组的首地址。所以输出2
*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,
输出5。
- int *ptr=(int *)(&a+1) 与int a[5]={1,2,3,4,5} 指针的变动
- int *ptr=(int*)(&a+1);
- int *ptr=(int *)(&a+1)
- int *ptr=(int *)(&a+1)
- int *ptr=(int *)(&a+1)
- int *ptr=(int *)(&a+1)
- int *ptr=(int *)(&a+1)
- int *ptr=(int *)(&a+1)问题的探讨
- int *ptr=(int *)(&a+1)问题的探讨
- 关于int *ptr=(int *)(&a+1)问题的探讨
- int *ptr=(int *)(&a+1)问题的探讨
- int *ptr=(int *)(&a+1)问题的探讨
- int *ptr=(int *)(&a+1)(面试题)
- 高通笔试题int *ptr=(int *)(&a+1)
- C/C++:面试题 int *ptr=(int *)(&a+1);
- int *ptrl=(int*)(&a+1); int *ptr=(int*)((int)a+1) 这两个定义有什么区别
- int a[5]={}, &a+1与(int*)a+1的区别
- int *ptr2=(int *)((int)a+1);
- 其它_chrome插件开发
- 数的长度
- java基础Thread
- Cracking the coding interview Q1.2
- Struts2中action获取request、response、session的方式
- int *ptr=(int *)(&a+1) 与int a[5]={1,2,3,4,5} 指针的变动
- 有关于string= 与strcpy()的区别
- C语言实现的在framebuff上面显示图片
- SSH集成开发面试问题
- CCControlButton的使用
- 注册asp.net 4.0 到iis
- 如何欣赏音乐(二)
- 如何欣赏音乐(三)
- Ubuntu下android adb 连接