printf("%x,%x",ptr1[-1],*ptr2)的思考

来源:互联网 发布:淘宝如何转企业店铺 编辑:程序博客网 时间:2024/06/05 06:38
    int a[5] = {1,2,3,4,5};
    int *ptr1 = (int *)(&a+1);
    int *ptr2 = (int *)((int)a);
    int *ptr3 = (int *)((int )a +1);

    printf("ptr:%d, ptr2:%x, ptr3:%x\n", ptr1[-1], *ptr2, *ptr,);

答案:5,  1,  2 00 00 00

看似很简单的语句,却很复杂,

 首先要搞清楚&a和a的区别,a是数组首元素的首地址而&a是整个数组的首地址,a+1是偏移int个字节,而&a+1是偏移整个数组的大小也就是20字节。那么推出ptr1[-1]=5了。

  a是数组的首地址,那么就指向01 00 00 00的地址,由于是小端格式,高字节存高位,那打印是先去高字节的,所以ptr2就打印出00 00 00 01,也就是1

  a强制转换成int,那么它不在是指针了,而是一个整形的数,数+1再强制转换成int*,相当于移动了1字节。指向01 00 00 00 02中的01后面那个00,因为是小端模式,所以打印是高字节对应高位,因为在内存中,int a[5]是这么存储的,01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00。所以02相对01来说是高字节,所以打印是02 00 00 00

0 0
原创粉丝点击