地址的强制转换

小涛有一次给我看了一篇博客:http://c.biancheng.net/cpp/html/476.html.

int main()
{
   int a[4]={1,2,3,4};
   int *ptr1=(int *)(&a+1);
   int *ptr2=(int *)((int)a+1);
   printf("%x,%x",ptr1[-1],*ptr2);
   return 0;
}

那个强制转换给我搞懵了。a不是本来就是一个int形的4字节地址吗?

后来看了下面的注解才明白。a确实是数组的首地址,强制转换后是a的第一个字节的地址。

即a只是个表示地址的标识符,a+1,这个1的大小与a数组的类型有关,表示加上一个元素大小的偏移量。

以前看书真是太不仔细了。

由此也得出判断操作系统大小端的方式,直接上代码:

int main(int argc,char** argv)
{
    short a = 0x1122;

    if (*(char*)&a == 0x22)
    {
        printf("small
");
    }
    else
    {
        printf("big
");
    }
    


    return 0;
}
原文地址:https://www.cnblogs.com/wyc199288/p/5566993.html