Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842478
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-09-25 12:13:05

先从题目说起
 

   int a[]={10,20,30,40,50}; 
   char *p,*q;
   p=(char*)(a+1);
   q=(char*)a;
 
   printf("p is 0x%x\n", p);
   printf("q is 0x%x\n", q);
   printf("%d is %d\n", p-q, a[p-q]);

 

运行下,你就发现p-q是4!!! why???  a是int类型嘛,p,q是char类型!!  a+1-a是相当于一个int,4个char.

int a[]={10,20,30,40,50};
   short *p,*q;
   p=(short*)(a+1);
   q=(short*)a;

这个也是一样的,p-q就是2了.

int a[5] = {1,22,3,4,5};

  int *ptr1 = (int*)(&a + 1);
  int *ptr2 = (int*)((int)a + 1);

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

   int *ptr1 = (int*)(&a + 1);

   &a 和 a 和 &a[0],都是同一个值,但是它们类型不同。 &a 的类型是:int (*)[5],指向5个int的指针。所以,&a加1,就等于加了5个int的长度。
printf的时候,减去1,则打印的是a[4]的值。

   int *ptr2 = (int*)((int)a + 1);
同样,(int)a 和 &a 和 a 和 &a[0],都是同一个值,但是它们类型不同。 (int)a的类型是int,是一个整型。所以,加1就是直接加1。于是4个字节的int被截断了。
小端情况下,a按字节表示是: 0x01,0x00,0x00,0x00,0x02,0x00…… 地址值加1后,得到的int是0x00,0x00,0x00,0x02,连起来就是0x02000000。

 



 

阅读(922) | 评论(0) | 转发(0) |
0

上一篇:Boyer-Moore原理加代码

下一篇:解惑dup/dup2

给主人留下些什么吧!~~