栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

深入理解int *ptr=(int *)(&a+1)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入理解int *ptr=(int *)(&a+1)

目录
  • 前言
  • 正文

前言

碰到一道比较经典的面试题,特此记下来

正文

题目如下,问输出的结果是多少

main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

从内存分布的角度分析

&a和a做右值时的区别:
如上图,&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。

&a是数组指针,其类型为int(* )[5]; 所以 &a+1就是int (* )[5]+1,如上图所示,&a+1就是相当于整个数组指针加1,执行&a+1后,ptr的偏移量相当于 a + sizeof(int) * 5 * 1。&a+2就是相当于整个数组指针加2,执行&a+2后,ptr的偏移量相当于 a + sizeof(int) * 5 * 2

这里之所以需要强制类型转换,因为类型不匹配

&a是int(* )[5];ptr是 int *类型。 正是因为这里强制类型转换,所以

printf("%d %d nr", *(a + 1), *(ptr - 1) )

因为 ptr 为int *类型,所以这里ptr-1也就是减一个sizeof(int),也就是a[5]最后一个元素。有些人想不通为什么-1为啥不减到&a呢,就是因为这里强制类型转换了。主要结合两张图理解,轻松就理解了


这里

&a,&a+1,&a+2 相互之间就是差20个字节

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/676064.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号