深入理解C语言的指针*和引用&
来源:互联网 发布:帮助画画的软件 编辑:程序博客网 时间:2024/06/07 05:22
首先是一道关于类型转换的面试题,要求给出float变量强制转换成int型和int &输出的结果。
int test(){float a = 1.0f;cout<<"value of (int)a is "<<(int)a<<endl;cout<<"value of &a is "<<&a<<endl;cout<<"value of (int &)a is "<<(int &)a<<endl;cout<<boolalpha<<((int)a == (int &)a)<<endl;return 0;}
以前编程经常用到强制转换(int)variable,对于上例,就是把float型的值1.0作为int型输出1,但是如何理解(int &)variable,为什么输出会是一个大整数1065353216呢?这里需要区分&的两个作用:取地址和引用。以下是参考CSDN论坛的详细解释。
(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对float b = 0.0f;的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示 (int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
我们再看变量中使用指针*和引用&的例子,&作为引用主要是用在变量的声明,也就是将此变量作为一个别名,两变量内存地址完全相同。下面是对int *a, int &b, int * &c, int & *d的实验和简单说明。
int test(){int i = 10;int *a = &i;/* a是一个指针,指向i的地址, &取地址 */cout<<"value of a is "<<a<<endl;/* i的地址 */int &b = i;/* b是引用,和i指向同一地址,可视为i的别名 */cout<<"value of b is "<<b<<endl;/* i的内容,10 */cout<<"value of &b is "<<&b<<endl;/* i的地址 */int * &c = a;/* c是引用,引用的类型是指针(和a相同) */cout<<"value of c is "<<c<<endl;/* c是a的别名 *//* int & *d = b;d是一个指针,但引用不是实体,所以是错误的 */return 0;}
- 深入理解C语言的指针*和引用&
- 深入理解C语言的指针*和引用&
- 深入理解C++的指针和引用
- 深入理解C语言指针的奥秘- -- -
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解c语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 在Eclipse中使用JUnit4进行单元测试(初级篇)
- CS开发商官方辟谣:我们没在做游戏主机
- 给电影的模型(Model)和表格增加新的字段(ASP.NET MVC3系列文章七)
- web.py XML访问 例子详解 AttributeError: No template named index 异常解决方案
- android组件之gallery 、imageswitcher 详解
- 深入理解C语言的指针*和引用&
- Eclipse导出JAR包
- Ext.net.DirectMethods
- poj 1230 C++解法
- 利用convertView优化ListView性能
- 通过对象显示message text
- 18个经典培训故事
- 【转】javascript操作数组
- 如何远程连接MySQL