使用指针分隔整数数字

时间:2015-04-15 06:49:42

标签: c++ pointers

我有一个整数(i)占用4个字节,我假设它存储在这样的内存中,起始地址为1000,

enter image description here

如果我写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。

我意识到我假设内存结构的方式是错误的, 所以没有办法使用指针获取实际数字 ??

4 个答案:

答案 0 :(得分:5)

值为int的{​​{1}} 通常会存储为四个字节,其值为15261,{{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)

我可以看到你想要提取数字的每个数字。 要实现它你需要:

  1. 得到i除以10的提示。请执行以下操作:const int r = i % 10;
  2. i除以10:i /= 10;
  3. 如果i不为0,请转到1.
  4. 实施(未经测试)可能是这样的:

    do
    {
         const int r = i % 10;
         // do anything you need with r
         i /= 10;
    } while (i > 0);
    

    这将为您提供从不太重要的数字开始的每个数字。