Chinaunix首页 | 论坛 | 博客
  • 博客访问: 603805
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类: C/C++

2008-11-07 10:27:51

 

#include <stdio.h>

#define fb_base_addr 0x30000000

void func(unsigned long x,
          unsigned long y,
          unsigned long color)
{
    unsigned short *addr = (unsigned short *)(fb_base_addr + (y * 240 + x)); (1)
    
        unsigned short *addr = (unsigned short *)fb_base_addr + (y * 240 + x); (2)

    *addr = 0x55aa;

}

int main( void )
{
    func(1,0,0xff0000);    
    return 0;
}

 

上面就是代码,问题是 1,2 两种不同的赋值办法,得到的 指针地址 addr 分别是多少?1和2的分别就是查了一个括号,那么C究竟是怎么处理的呢?开ADS编译运行了一下得到的答案是 : 1得到的地址是 0x30000001 ,2得到的地址是 0x30000002 。这里延伸出一个问题。记得以前看过一些C的面试题目,出现过类似的问题,关键是编译器是怎么判断的。

1中,加了括号,那么整个地址是先计算出来,传入的x=1 y=0很显然计算结果是0x30000001然后再做强制数据类型转换,变成16位指针地址。

而2当中,是先做了强制类型转换,那么后面计算的 y*240+x 结果也是为1的,但是因为前面的地址已经强制转换成 short 类型了,所以这个偏移是 1个short长度,而不是一个单纯的地址长度,short是16bit的,所以最后得到 addr应该是 0x30000002

记录一下,面试的时候可能有用。

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

上一篇:NEC的TFT液晶点亮了 -v-

下一篇:开始啃UBOOT

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