c语言指针的超级难题


#include

int main() {
    int a[]={1,2,3,4};
    int *p=(int *)((int)a+1);
    printf("%x",*p);//结果为什么是2000000 
    return 0;
}

楼上同学,不要误导人家
这明显考的是内存分布,即使是64位系统,int 也是占用4个字节,跟系统没有关系
回到题目,现在内存分配应该是这样:
01 00 00 00 00 00 00 00
02 00 00 00 00 00 00 00
0300 00 00 00 00 00 00
04 00 00 00 00 00 00 00
上面内存是连续的哦
假如a 现在地址是0x1000,指向01 这个内存,实际是要看内存4个字节空间
将0x1000,转换为int 后 加1,相当于指向了01 之后的00
这个时候如果再看4个字节,那么因为是从01 之后的00开始,你数32位,也就是4个字节,恰好是到02
最后的结果应该是02 00 00 00 00 00 00 00 ,用十六进制就是2000 0000

相信每个人的运行结果都是不一样的,我这里运行直接报错
根据你的式子int *p=(int *)((int)a+1);得不出准确结果最大最不稳定因素就是a的地址各不相同。
a + 1a的地址+1,十六进制+十进制?然后再将a+1转化为整型右强转为指针?确实时是超级难题,咱们别纠结这些好吧


#include<stdio.h>
 
int main() {
    int a[]={1,2,3,4};
    //int *p=(int *)((int)a+1);
    int *p=(b+1);//指针和数组的引用,这里的a+1是表示指针的位置指向数组的下一个,也就是a[1] 
    printf("%x",*p);//结果为什么是2000000 
    return 0;
}

这不是扯呢吗,如果你是64位系统,指针长度是8字节,int是4字节,一截断,当然是个随机值,没崩溃就很好了,这问题有啥意义?