zoukankan      html  css  js  c++  java
  • C++中强制变换之const_cast

    今天学习了一下C++中的强制转换,看了const_cast,我发现了这个转换关键字的奇怪之处,于是把它记录一下,废话不说,先看一个程序:

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     const int val = 5;
     8     int test =5;
     9     //int *pval = &val;    //err: cannot convert from 'const int * to int *'
    10     int *pval = const_cast<int *>(&val);
    11     cout << "Before:" << endl;
    12     cout << "  val:" << val << endl;
    13     cout << "*pval:" << *pval << endl;
    14     *pval = 10;
    15     cout << "After:" << endl;
    16     cout << "  val:" << val << endl;
    17     cout << "*pval:" << *pval << endl;
    18     return 0;
    19 }

    以上程序打印的结果:

    一开始 *pval 和val的值都是5,因为他们指向同一地址。

    但是后来我通过给(*pval)赋值,是的指针pval所指向的内存地址为10,然后打印去而发现val 还是等于 5 而*pval却等于10,这是很矛盾的啊,按理讲他们是内存中同一块地址中的内容,应该完全一样啊,我很不解,于是我看了一下内存:

    以上图中的地址就是val的内存地址,但是通过上面的图可以看到,0012FF44地址处的值为 0000000A(16进制,4个字节) = 10 (十进制)。

    也就是说内存中的内容确实被改变了,只是编译器在输出const int val时并不是读取内存地址内容!为了搞懂这个问题我又汇编了一下:

    发现在输出val值得过程中,编译器直接将5赋值给val,而不是工内存中读取。这就解释了为什么指向内存中同一个地址,输出的值却不同!

  • 相关阅读:
    Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1
    Codeforces 796C. Bank Hacking
    Codeforces 792B. Counting-out Rhyme
    gym 101164 H.Pub crawl 凸包
    hdu 6053 TrickGCD 筛法
    hdu 6041 I Curse Myself 无向图找环+优先队列
    bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
    codeforces gym 101164 K Cutting 字符串hash
    树链剖分求lca
    UESTC 1697 简单GCD问题(一) 筛法
  • 原文地址:https://www.cnblogs.com/zhuwbox/p/3383188.html
Copyright © 2011-2022 走看看