•需求

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

  对于如下程序:

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 :

$\begin{aligned} 0XFA07B &= F\times 16^{4}+ A\times 16^{3} + 0\times 16^{2} + 7\times 16^{1} + B\times 16^{0} \\ &= 15\times 16^{4}+ 10\times 16^{3} + 0\times 16^{2} + 7\times 16^{1} + 11\times 16^{0} \\ &= 1024123\end{aligned} $

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

int change(char c)//分解出每一位对应的数字
{
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return c - '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;
string str = & a;
}

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

  这可如何是好?

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

freopen

函数简介

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

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

函数原型

*FILE freopen( const char filename, const char mode, FILE stream );

参数介绍

  • filename:需要重定向到的文件名或文件路径
  • mode:代表文件访问权限的字符串
    • "r":表示 只读访问
    • "w":表示 只写访问
    • "a":表示 追加写入
  • stream:需要被重定向的文件流
    • stdin 表示从文件中读取
    • stdout 表示输出到文件中

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

CODE

#pragma warning(disable:4996)//VS2022取消返回值被忽略的报错
#pragma warning(disable:4786)//VS2022取消使用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;
return c - '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 输出的信息

  完结撒花~~~

•声明

参考资料

  1.【freopen函数用法|CSDN

C 如何将输出的地址转化为十进制数的更多相关文章

  1. PHP中将ip地址转成十进制数的两种实用方法

    As we all know that long2ip works as ip1.ip2.ip3.ip4 (123.131.231.212) long ip => (ip1 * 256 * 25 ...

  2. 专题1-MMU-lesson2-深入剖析地址转化

    1.地址转化总体分析 level one fetch和level two fetch分为一级转换和二级转换. 由上图右边可以看出,首先通过TTB(Translation Table Base)寄存器找 ...

  3. C++学习010-将某个地址转化为指针

    如果需要将某个具体的地址转化为指针,可以直接使用类型那个转换来是实现. 实例如下 int main() { void* pData = (void*)(0x004001); std::cout < ...

  4. IP多播与NAT地址转化

    IP多播 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用IP多播地址. 如果某台主机想要收到某个特定的多播分组,那么怎样才能是这 ...

  5. 已知IP地址和子网掩码求出网络地址、广播地址、地址范围和主机数(转载https://blog.csdn.net/qq_39026548/article/details/78959089)

    假设IP地址为128.11.67.31,子网掩码是255.255.240.0.请算出网络地址.广播地址.地址范围.主机数.方法:将IP地址和子网掩码转化成二进制形式,然后进行后续操作. IP地址和子网 ...

  6. 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。

    编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列. 实现了unsigned long型的转换. // 十进制转换为二进制,十进制数的每1bit转换为二进制的1 ...

  7. 10,随机等概率的输出m个不重复的数

    今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m).遂记录下来. 首先,产生随机数,不免要用到srand,rand函数.先简单介绍下两个函数. 1,void s ...

  8. 通过崩溃地址找错误行数之Delphi版

    通过崩溃地址找错误行数之Delphi版2009-5-11 17:42:35 来源: 转载 作者:网络 访问:360 次 被顶:2 次 字号:[大 中 小]核心提示:什么是 MAP 文件?简单地讲, M ...

  9. java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

    package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Test { /* * 将任 ...

随机推荐

  1. Shell条件练习题

    Shell条件练习题 目录 Shell条件练习题 1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限 2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的 ...

  2. HTML基础笔记整理

    「学习笔记」HTML基础 前言 勤做笔记不仅可以让自己学的扎实,更重要的是可以让自己少走弯路.有人说:"再次翻开笔记是什么感觉",我的回答是:"初恋般的感觉". ...

  3. 2、前端--初见前后端交互、CSS简介、基本选择器、组合选择器、属性选择器、分组与嵌套、伪类选择器

    今日内容概要 初窥后端框架 css简介 css选择器 今日内容详细 初次体验前后端交互 # 代码无需掌握 只看效果即可 """后端框架:可以简单的理解为别人写好的一个非常 ...

  4. Solution -「CF 1025D」Recovering BST

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),问是否存在一棵二叉搜索树,使得其中序遍历为 \(\{a_n\}\),且相邻接的两点不互素.   ...

  5. jmeter重点(详细)

    之前,写过一篇文章:jmeter,学这些重点就可以了,今天就来把一些重点细节点说一下. 测试计划 可以理解为各种测试元件的容器 其中: 定义整个测试中使用的重复值(全局变量),一般定义服务器的ip.端 ...

  6. 宿主机ping不通虚拟机,虚拟机能ping通宿主机

    最近,微信提升群里好几个小伙伴遇到了如题的问题. 问了下原因,原来是我说的把宿主机网卡ip获取方式改为自动,结果他们把宿主机上虚拟网卡的ip改为自动了. 当然,分析"宿主机ping不通虚拟机 ...

  7. Html简单标签

    学习html <h1> 标题标签</h1> 标题标签 <p>段落标签</p> 段落标签 换行标签</br> 换行标签 水平线标签</h ...

  8. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

  9. MySQL 学习笔记(一)MySQL 事务的ACID特性

    MySQL事务是什么,它就是一组数据库的操作,是访问数据库的程序单元,事务中可能包含一个或者多个 SQL 语句.这些SQL 语句要么都执行.要么都不执行.我们知道,在MySQL 中,有不同的存储引擎, ...

  10. Vue 源码解读(10)—— 编译器 之 生成渲染函数

    前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...