C-基础:数组名与取地址符&
2024-08-30 15:42:57
指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)
main()
{
int a[]={,,,,};
int *ptr=(int *)(&a+);
printf("%d,%d",*(a+),*(ptr-));
}
输出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5,&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int),所以,int *ptr=(int *)(&a+1);ptr实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*),a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
最新文章
- [LeetCode] Employees Earning More Than Their Managers 员工挣得比经理多
- 制作dll自动注册工具
- 【转载】C#之int与Java之Integer的区别
- asp.net的code-Behind技术
- (medium)LeetCode 207.Course Schedule
- [转]Ubuntu下配置NFS服务
- MAC下搭建web开发环境
- c# 遍历文件夹及其所有文件
- Map(关联式容器)
- python中3个帮助函数help、dir、type的使用
- Mysql之单表记录查询
- HDU 5723 Abandoned country 最小生成树+搜索
- BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS
- Python学习笔记十二
- os模块walk方法
- 小甲鱼Python第二十一讲课后习题
- indexOf includes 区别
- tensorflow-优化器
- 初识nginx——配置解析篇
- 使用easypoi导出excel