谁能解释一下下面的代码?

嵌入式Linux,
嵌入式领域专家
博客专家认证
2017-11-24 10:27:38
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

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


...全文
260 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2017-11-24
  • 打赏
  • 举报
回复
引用 6 楼 郁闷星期三的回复:
[quote=引用 2 楼 cfjtaishan 的回复:] 首先需要了解的是a和&a的区别; a是数组名,也是数组的首地址,类型是int *; &a是数组的地址,这个地址值和a的地址值是一样的,因为都指向同一个地址;但&a的类型是int (*)[5];即&a是5个元素为单位的地址; 所以a+1是向后偏移一个int类型长度的地址,即元素2的地址; &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。 p-1是向后偏移一个sizeof(int)个字节,因为p的类型是int *
你看我打印(int *)(&a +1) 的地址是 0x0018ff35 这个这个地址明显不是5*sizeof(int)的[/quote] 在我这不会,它的值应该是要和p是一样的
paschen 2017-11-24
  • 打赏
  • 举报
回复
输出是2和5,数组名a退化为指针后是int*类型,+1移动1个int距离,&a是int(*)[5]类型,+1移动的是一个数组的大小
嵌入式Linux, 2017-11-24
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
首先需要了解的是a和&a的区别; a是数组名,也是数组的首地址,类型是int *; &a是数组的地址,这个地址值和a的地址值是一样的,因为都指向同一个地址;但&a的类型是int (*)[5];即&a是5个元素为单位的地址; 所以a+1是向后偏移一个int类型长度的地址,即元素2的地址; &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。 p-1是向后偏移一个sizeof(int)个字节,因为p的类型是int *
你看我打印(int *)(&a +1) 的地址是 0x0018ff35 这个这个地址明显不是5*sizeof(int)的
CT8100 2017-11-24
  • 打赏
  • 举报
回复
*(a+1)=a[0+1]; *(p-1)=*((int *)(&a +1)-1)=(a数组的地址后加一个int地址再减掉一个int地址最后指向a[4]) =a[4];
嵌入式Linux, 2017-11-24
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
首先需要了解的是a和&a的区别; a是数组名,也是数组的首地址,类型是int *; &a是数组的地址,这个地址值和a的地址值是一样的,因为都指向同一个地址;但&a的类型是int (*)[5];即&a是5个元素为单位的地址; 所以a+1是向后偏移一个int类型长度的地址,即元素2的地址; &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。 p-1是向后偏移一个sizeof(int)个字节,因为p的类型是int *
谢谢谢谢!
老马何以识途 2017-11-24
  • 打赏
  • 举报
回复
这种题目锻炼C语言的细节理解,虽然实际项目中不推荐这么写。
自信男孩 2017-11-24
  • 打赏
  • 举报
回复
首先需要了解的是a和&a的区别; a是数组名,也是数组的首地址,类型是int *; &a是数组的地址,这个地址值和a的地址值是一样的,因为都指向同一个地址;但&a的类型是int (*)[5];即&a是5个元素为单位的地址; 所以a+1是向后偏移一个int类型长度的地址,即元素2的地址; &a+1是向后偏移5 * sizeof(int)长度。 了解这些就基本上能理解输出的结果了。 p-1是向后偏移一个sizeof(int)个字节,因为p的类型是int *
赵4老师 2017-11-24
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧