我有一个整数(i)占用4个字节,我假设它存储在这样的内存中,起始地址为1000,
如果我写int*p=&i;
p现在存储起始地址,即1000。
如果我增加p,它指向地址1004。
有没有办法遍历地址1000,1001,1002和1003,以便我可以使用指针分隔和打印数字1,5,2,6? 请帮助..... :((新手)
我对存储的假设可能有误有人可以帮我纠正吗? :(
编辑1
根据Mohit Jain的回答以及其他人的建议,
unsigned char *cp = reinterpret_cast<unsigned char *>(&i);
for(size_t idx = 0; idx < sizeof i; ++idx) {
cout << static_cast<int>(cp[idx]);
}
我得到了答案 246 5 0 0。
我意识到我假设内存结构的方式是错误的, 所以没有办法使用指针获取实际数字 ??
答案 0 :(得分:5)
值为int
的{{1}} 不通常会存储为四个字节,其值为1526
,1
,{{1 }和5
。
相反,它将以二进制形式存储。假设一个小端机器,字节将具有值:0,0,5,246(如果它是大端,你将以相反的顺序获得相同的值)。这些数字的原因是它可以在每个字节中存储0到255的值。因此,它存储为5 * 256 + 246.当处理像这样的存储器中的值时,使用十六进制而不是十进制通常是方便的(并且很常见),在这种情况下,您可以使用十六进制数字。 d将其视为0x05F6。
获取十进制数字的常用方法涉及比指针更多的数学。例如,最低有效数字将是将值除以10后的余数。
答案 1 :(得分:2)
列出内存内容
使用指针(依赖于endian-ness的输出)
unsigned char *cp = reinterpret_cast<unsigned char *>(&i);
for(size_t idx = 0; idx < sizeof i; ++idx) {
cout << static_cast<int>(cp[idx]);
}
不使用指针(endian-ness独立输出),因为数字不会以你假设的方式存储。
int copy = i;
unsigned int mask = (1U << CHAR_BIT) - 1U;
for(size_t idx = 0; idx < sizeof i; ++idx) {
cout << (copy & mask);
copy >>= CHAR_BIT;
}
列出数字
如果你想使用指针整数的数字,你应该首先将整数转换为字符串:
std::string digits = std::to_string(i); // You can alternatively use stringstream
char *p = digits.c_str();
for(size_t idx = 0; idx < digits.length(); ++idx) cout << (*p++);
答案 2 :(得分:0)
您可以将指针强制转换为(char *)并将该指针递增以指向单个字节的开头。但是,你的存储假设是错误的,所以你不会得到那样的数字。
答案 3 :(得分:0)
我可以看到你想要提取数字的每个数字。 要实现它你需要:
i
除以10的提示。请执行以下操作:const int r = i % 10;
i
除以10:i /= 10;
i
不为0,请转到1. 实施(未经测试)可能是这样的:
do
{
const int r = i % 10;
// do anything you need with r
i /= 10;
} while (i > 0);
这将为您提供从不太重要的数字开始的每个数字。