• C 如何将输出的地址转化为十进制数


     

    •需求

      这两天在看内存对齐的相关问题,因此产生了一个,如何将地址转换为十进制数?

      对于如下程序:

    复制代码
    void func()
    {
        int a = 10;
    
        printf("a 的地址为:%p\n", &a);
    }
    复制代码

      通过格式控制符  %p 以及取地址符  &a ,可以很方便的输出变量 a 的地址。

       printf 函数中对于  %p  一般以十六进制的方式输出指针的值:

      一般而言,十六进制对于分析各个变量间的内存空间位置没那么方便,此时往往需要将其转化为十进制。

      如何那么,该转换呢?

    •十六进制地址转十进制

    方法一

      复制输出控制台输出的十六进制代码,通过在线进制转换工具将其转化为十进制。

      是不是简单粗暴,但是当要转化的地址多的时候,这个方法往往比较繁琐,那么还有没有其他方法呢?

    方法二

      首先,编写一个十六进制转十进制的代码,下面做一下简单介绍。

    • 十进制:逢十进一,数字中含有 0,1,2,3,4,5,6,7,8,9
    • 十六进制:逢十六进一,表示形式比较特殊,0~9 正常用数字表示,10~15 用英文字母 A~F(或 a~f) 来表示
      • 10 用 A 表示
      • 11 用 B 表示
      • 12 用 C 表示
      • 13 用 D 表示
      • 14 用 E 表示
      • 15 用 F 表示

      在十六进制的表示中,大写字母小写字母都可以,一般有个 0x 前缀表示当前的数用十六进制表示。

      有了相关的知识储备,我们来看看十六进制如何转化为十进制,假设需要转换的十六进制数为 0XFA7B :

    0XFA07B=F×164+A×163+0×162+7×161+B×160=15×164+10×163+0×162+7×161+11×160=1024123

      是不是超级简单,那我们通过编程语言来实现一下:

    复制代码
    int change(char c)//分解出每一位对应的数字
    {
        if (c >= 'a' && c <= 'f')
            return c - 'a' + 10;
        if (c >= 'A' && c <= 'F')
            return c - 'A' + 10;
        if (c >= '0' && c <= '9')
            return c - '0';
     
        return 0;//如果是前缀的X,输出0,不影响最终答案
    }
    int hexToDecimal(const string& str)//十六进制转十进制,十六进制保存在字符串中
    {
        int len = str.length();
        int x = 1;
        int ans = 0;
        for (int i = len - 1; i >= 0; i--)//从右往左依次处理每一位
        {
            int num = change(str[i]);
            ans += num * x;
            x *= 16;
        }
        return ans;
    }
    复制代码

      这儿有一道进制转换的题目,有兴趣的小伙伴可以用来测试一下程序的正确性:华为机试|HJ5 进制转换。

      有了十六进制转十进制的方法,那么,如何将地址输出的十六进制代码转化为字符串呢?

      这样操作?

    复制代码
    void func()
    {
        int a = 10;
        string str = & a;
    }
    复制代码

      显然不行,编译都不通过;

      这可如何是好?

      莫慌,我们可以曲线转换,下面介绍一下 freopen函数用法。

    freopen

    函数简介

      freopen 是被包含于 C标准库头文件  stdio.h  中的一个函数,用于重定向输入输出流。

      该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。

    函数原型

     *FILE freopen( const char *_Filename, const char *_Mode, FILE _Stream ); 

      具体内容,请参考:🔗。

      接下来,通过 freopen 实现来完美的实现地址转十进制。

    CODE

    复制代码
    #pragma warning(disable:4996)//取消返回值被忽略的报错
    #pragma warning(disable:4786)//取消使用STL中一些容器的报错
    #include<bits/stdc++.h>
    using namespace std;
    
    int change(char c)//分解出每一位对应的数字
    {
        if (c >= 'a' && c <= 'f')
            return c - 'a' + 10;
        if (c >= 'A' && c <= 'F')
            return c - 'A' + 10;
        if (c >= '0' && c <= '9')
            return c - '0';
     
        return 0;//如果是前缀的X,输出0,不影响最终答案
    }
    int hexToDecimal(const string& str)//十六进制转十进制,十六进制保存在字符串中
    {
        int len = str.length();
        int x = 1;
        int ans = 0;
        for (int i = len - 1; i >= 0; i--)//从右往左依次处理每一位
        {
            int num = change(str[i]);
            ans += num * x;
            x *= 16;
        }
        return ans;
    }
    void func()
    {
        int a = 10;
        printf("%p\n", &a);//通过输出重定向,将地址输出到addressToDecimal.txt中
        string str;
        cin >> str;//从addressToDecimal.txt读取已保存的a的地址
        cout << "a的地址为:" << str << ",十进制为:" << hexToDecimal(str) << endl;
    }
    int main()
    {
        freopen("addressToDecimal.txt", "r", stdin);
        freopen("addressToDecimal.txt", "w", stdout);
    
        func();
        return 0;
    }
    复制代码

      我们设置的 freopen 的第一个参数就只是一个文件名,那么该文件默认放到项目所在地址,VS可通过右击找到该项目所在文件夹。

      打开  addressToDecimal.txt 你会发现里面的内容就是包含两项:

    1. 通过 printf 输出的 a 的地址
    2. 通过 cout 输出的信息

      完结撒花~~~


    __EOF__

  • 本文作者: MElephant
  • 本文链接: https://www.cnblogs.com/hyacinthLJP/p/16044306.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
  • 相关阅读:
    win11系统影响玩游戏吗?适合玩游戏吗?
    Request之登录系统跳转应用以及原理详解【JavaWeb】
    模拟退火补完计划
    深入理解ElasticSearch集群:架构、高可用性与数据一致性
    手写 Promise
    [SpringBoot]SpringBoot概述(简介、官网构建、快速启动)
    基于springboot的“老年智慧云”老年人在线学习平台毕业设计源码262221
    程序员想要网上接单却不知道如何是好?那这篇文章你可得收藏好了!
    java计算机毕业设计ssm+vue 大好前途高校毕业生求职招聘网站
    2020-ViT ICLR
  • 原文地址:https://www.cnblogs.com/hyacinthLJP/p/16044306.html