关于指针和数组的移动
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int * )(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
程序运行的结果是:2,5
.
2
这个结果没什么异议*(ptr-1)
为什么5呢? 因为是&a+1
移动的是一整个数组的长度(&a
是整个数组的长度5*int
),之后强制类型转换(int*)
,ptr-1
移动之后的字组长度的首地址再向后移动一个int
, 到了前面数组的最后一个字节地址了, 所以是5
.
经测试把a[5]
改成a[6]
, 加一个元素6
, 输出也是6
.
#include<stdio.h>
int main()
{
int a[6] = { 1, 2, 3, 4, 5, 6 };
int *ptr = (int*)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
把&a
改成&a[0]
,移动的就是一个int
了,结果为2,1
, 如下:
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a[0] + 1); //这样改后 "int *" 可以不要了.
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了