首先是一道关于类型转换的面试题,要求给出float变量强制转换成int型和int &输出的结果。

[cpp] 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 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的实验和简单说明。

[cpp] 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语言的指针*和引用相关推荐

  1. C语言_指针和引用的区别

    文章目录 指针和引用的区别 0.前言 1.指针.指针变量和引用 2.指针变量和引用变量的定义 3.引用的用途 4.引用和指针的区别 5.引用的底层原理 6.代码示例 6.1.示例程序1 6.2.示例程 ...

  2. C语言面试-指针和引用的使用场景?

    先解决两个疑问 ◆ 指针和引用的不同之处是什么? ◆ 何时用用指针?何时用引用? 指针和引用的不同之处 看如下代码: 指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址. 而引用就是给变量重 ...

  3. 【C语言】指针和引用的区别

    [对象] C++primer中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间. 一个对象a,它有值和地址&a,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通 ...

  4. 面试准备每日五题:C++(三)——全局局部变量、内存分配、strcpysprintfmemcpy、函数指针、引用

    文章目录 1. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的? 2. 简述C.C++程序编译的内存分配情况 3. 简述strcpy.sprintf 与memcpy 的区别 ...

  5. 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )

    文章目录 I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比 I . 引用概念 C++ 对 C 扩充 : ...

  6. c语言实参形参函数调用指针引用 符号实例,C语言实参、形参、函数调用、指针、引用、符号实例.doc...

    C语言实参.形参.函数调用.指针.引用.符号实例 C语言实参.形参.函数调用.指针.引用.*&符号实例 实现环境:VC6 程序源代码: #include "stdio.h" ...

  7. c语言的指针和java引用传递参数,java传参数是传值还是引用

    1.基参数是本数据类型 传递是值(或者说值得副本). 2.参数是对象的话传递的是对象引用的副本.(1.修改引用副本指向新对象不会影响原来对象,2.修改引用指向的对象的属性会修改成功,3.如果传递时st ...

  8. c语言的结构体指针的引用,C语言中的指针、引用、数组、结构体

    指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里"引用"表示计算机内存地址.从指针指向的内存读取数据称作指针的取值 ...

  9. 面试题24——C++的引用和C语言的指针有什么区别

    C++的引用和C语言的指针有以下区别: (1)引用必须初始化,但是不分配存储空间.指针不声明时初始化,在初始化的时候需要分配存储空间.引用较比指针更加安全: (2)引用指向一块特定的内存,不能被更改. ...

最新文章

  1. 不看后悔 如何删除WIN7的100M隐藏分区
  2. Docker使用笔记
  3. 多项式曲线拟合最小二乘法
  4. 基于 Docker 的微服务架构
  5. hdu 1398 Square Coins/hdu 1028 Ignatius and the Princess III
  6. mosquitto查看订阅记录_Mosquitto\Client
  7. centos 添加路由命令_详解CentOS 6.4 添加永久静态路由所有方法汇总
  8. [C11] 推荐系统(Recommender Systems)
  9. 设置Qt直接运行路径
  10. 我的家庭私有云计划-6
  11. AndroidStudio 内存泄漏分析 Memory Monitor
  12. 下载了linux版redis怎么用,Linux下redis的安装与使用图文教程
  13. 解决CAD输出PDF字体周围有边框
  14. happen-before原则
  15. 计蒜客-植物大战僵尸
  16. 订单BOM、销售BOM、标准BOM
  17. UNICODE汉字数据库
  18. VisualStudio找不到Python.h
  19. dll与exe的区别
  20. 【清华集训2017模拟】Catalan

热门文章

  1. Fedora Core 4配置本地yum源
  2. msm8953+android8.1蓝牙名称修改、多产品采用不同名字的兼容
  3. Android中APK直接通过JNI访问驱动
  4. 字符串中不重复字符出现第一次的位置
  5. auto drop ssh failed ip address
  6. hashCode之一--两个对象值相同,有相同的hash code
  7. 显示内容长时,显示部分内容,鼠标移入显示全部内容
  8. LeetCode_Pascal's Triangle II_杨辉三角形II(Java实现)
  9. 数据结构源码笔记(C语言):二叉树遍历
  10. Acronis Disk Director Suite(windows7分区工具)