• (int)、(int&)和(int*)的区别(转)


    (1)、首先通过一个例子看(int)和(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; // 输出什么?

    输出:

    1

    1065353216

    false

    0

    0

    true

    解释:

    (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<<及==选择正确的重载版本。

    (2)、(int*)是将一个变量(此变量不能是浮点型,可以是整型、字符、指针)以地址的形式显示,和(int&)的原理一样,当(int&*)a出现时,它也相当于告诉它的上下文:“把这块地址中的内容当做一个地址看待!不要管它原来是什么。”

    例如:

    char p='a';

    cout<<(int)p<<endl;

    cout<<(int*)p<<endl;

    输出:

    97

    00000061

    这在输出字符数组的首地址时十分有用:

    char *p="abcd";

    cout<<(int*)p<<endl;

    否则cout<<p<<endl;

    输出的是abcd,而不是其首地址。

  • 相关阅读:
    初识Vulkan
    网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求
    Hello,Android
    熊猫猪新系统測试之四:Ubuntu 14.04
    iOS OC08,09_内存管理
    XML总结
    【Scala-ML】怎样利用Scala构建并行机器学习系统
    在vs2010中编译log4cxx-0.10.0具体方法(从下载、编译、解决错误具体介绍)
    UI_UITableView_搭建
    Angular 4 子路由
  • 原文地址:https://www.cnblogs.com/uestcsummer/p/5660744.html
Copyright © 2020-2023  润新知