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
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.