现在的位置: 首页 > 综合 > 正文

(int*) 和 (int&)的区别

2013年03月27日 ⁄ 综合 ⁄ 共 1065字 ⁄ 字号 评论关闭

(int*)

当需要对一个绝对地址赋值时, 我们需要用(int*)将这个绝对地址转化为内存的地址, 然后再对这个地址进行操作。

  int addr = 0x00481c40;
    *(int*)addr = 3;

这段代码将绝对地址0x00481c40的内容赋值为3. 这是在32位的系统中, 如果是64位, addr的转化应该为(long*)

(int&): 将某个变量解释为整型。

例子:

 float    a   =    1.0f;   
   cout    <<   (int)a    <<    endl;   
   cout    <<   (int&)a    <<   endl;   
   cout    <<   boolalpha    <<    (   (int)a    ==    (int&)a   )    <<    endl;   //   
输出什么?   
   float    b    =   0.0f;   
   cout    <<   (int)b    <<    endl;   
   cout    <<   (int&)b    <<    endl;   
   cout    <<   boolalpha    <<    (   (int)b    ==    (int&)b   )    <<    endl;   //   
输出什么?   
    
  
答:分别输出falsetrue。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。   
  
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:把这块地址当做整数看待!不要管它原来是什么。这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。   
  
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<==选择正确的重载版本。   

抱歉!评论已关闭.