EazyChange

导航

 

小涛有一次给我看了一篇博客: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\n");
    }
    else
    {
        printf("big\n");
    }
    


    return 0;
}

 

posted on 2016-06-07 14:59  EazyChange  阅读(619)  评论(0编辑  收藏  举报