关于指针和数组的移动

#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;  
}

posted @   double64  阅读(189)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示