XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog
 1 #include <iostream>  
 2 #include <stdio.h>  
 3 #include <string.h>  
 4 #include <conio.h>  
 5 using namespace std;  
 6   
 7 int main()  
 8 {  
 9     float a = 1.0f;  
10   
11     cout << (int)a << endl;     //将浮点型强制转换为整型1  
12     cout << &a << endl;         //取a的地址十六进制00A7FD68  
13     cout << (int)&a << endl;    //把a的地址强制转换成十进制的整型11009384  
14     cout << (int&)a << endl;    //将a的引用强制转化为整型  
15   
16     return 0;  
17 }  

"cout << (int&)a << endl;"输出的结果是1065353216, 而不是1。这是因为浮点数在内存里和整数的存储方式不同,(int&)a相当于将该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,因此这取决于float型数据在内存中的存储方式,而不是经过(int&)a显示转换的结果(1)。

    因为float a = 1.0f在内存中的表示都是3f800000,而浮点数和一般整型不一样,所以当(int&a)强制转换时,会把内存值3f800000当作int型输出,所以结果自然变为了1065353216(0x3f800000的十进制表示)。

 

    要解释一下(int&)a:将a的引用强制转换为整型,意思是a所在的内存,原来定义的时候是float型,并初始化为1.01f,但现在要按int类型解释这段内存(即a所在的内存地址中的数据本来是按float型存储表示的,现在要强制按int型来解释)。

    1.0f在内存中的存储为(浮点型在内存中的表示详见此链接

    0   01111111   00000000000000000000000.

    按照整型数解释为2^29 + 2^28 + 2^27 + 2^26 + 2^25 + 2^24 + 2^23 = 1065353216(0x3f800000的十进制表示)。

    所以cout << (int&)a << endl;的结果就是1065353216。

 

    2.(int&a)

    (int&)a相当于:*(int*)&a,*(int*)(&a),*((int*)&a)。

 

     再比较一下(int&)a和(int)a

     (int&)a 不经过转换,直接得到a在内存单元(即地址)的值(引用即别名,通过引用是可以直接访问到实参和控制参数的)。

     (int)a a在内存中的值转换成int型。

 

     本文参考http://wenku.baidu.com/link?url=76IpDCg9rWlQpZZnYON7NIYkl4BHY24rI6cyEso0XccroC9V6VCpDSr_AYuSY9Xzg3eNNYE6rKG8aJH5hhA-r7aNcS3RO0REFrpUIXFtFHG

 


 

[C/C++]数组与指针——a,a[0],&a,&a[0]区别小结

 

1.a,a[0],&a,&a[0]

通过在VS上实验,以下是关于C语言中数组与指针的关系——a,a[0],&a,&a[0]之间的区别小小的总结

 

对于二维数组a[3][5]

a         int(*)[5]类型      ——即指向的是a[0]

a[0]     int *类型           ——即指向的是a[0][0]

&a       int(*)[3][5]类型  ——即指向的是整个数组的首地址

&a[0]   int(*)[5]类型      ——即指向的是a[0]

 

对于一维数组a[3]

a         int *类型           ——即指向的是a[0]

a[0]     int *类型           ——即指向的是a[0]

&a       int(*)[3]类型      ——即指向的是整个数组的首地址

&a[0]   int *类型           ——即指向的是a[0]

 

2.指针数组和指向数组的指针

 

int *p[5]     指针数组:是数组,但数组中的每个元素都是指针

int (*p)[5]   指向数组的指针:是指针,但它指向的是一个数组,相当于 int a[5]。 *p相当于a,即p=&a,则可合并为int (*p)[5]=&a。

 

3.指针加1

 

指针加1要根据指针类型加上一定的值,不同类型的指针加1之后增加的大小不同。

指针只是一个内存地址,但指针指向地址的长度可能不同

 

详细实例可参见博文 http://blog.csdn.net/tmljs1988/article/details/6704535

posted on 2015-05-28 13:48  不及格的程序员-八神  阅读(8)  评论(0编辑  收藏  举报