指针地址算术和十六进制/十进制转换

时间:2013-01-27 16:39:53

标签: c linux hex decimal pointer-arithmetic

我有一个从extern char etextendedata获得的指针地址。我还使用&<Variable Name>获取了变量的地址。两者都是十六进制指针地址。

我需要对这些十进制地址进行算术运算。我该怎么办?我需要将地址转换为十进制的int,这样我就可以通过减去地址来找到内存段的大小。

4 个答案:

答案 0 :(得分:3)

数学是数学。你做什么基础并不重要。无论如何,计算机仅在基座2中工作。只有在输入或输出期间才能确定基础。如果将它们解释为char *指针,则可以对指针进行字节算术:

ptrdiff_t segmentSize = (char *)segmentEndAddress - (char *)segmentStartAddress;

printf("Segment size in base 10: %td\n", segmentSize);
printf("Segment size in base 16: %tx\n", segmentSize);
printf("Segment size in base  8: %to\n", segmentSize);

答案 1 :(得分:2)

你可以用指针做算术。只要知道“单位”不是1,而是指向对象的大小。因此,如果p是指向整数的指针,则p + 1和p之间的地址差异可能是4个字节或更多。

如果你想用地址算术,你应该使用指向char的指针或将它们转换成这样的指针。

答案 2 :(得分:1)

没有“十六进制变量”,而是可以在某种表示中打印的变量。此外,该标准不保证int可以保存指针对象。如果您使用C99或C11,则可以使用可选类型(u)intptr_t来执行此操作。

uintptr_t n = (uintptr_t)(void *)etext;

答案 3 :(得分:1)

  

两者都是十六进制指针地址......我需要进行算术运算   十进制的那些地址。我该怎么做?

十进制和十六进制只是表示...显示数字的方法。但无论我写10还是0xA,它们仍然是相同的数字。指针是一个数字,您可以用十进制或十六进制表示该数字,但它仍然只是一个数字。所以,你可以这样做:

char *foo = "A dog and a cat";
int offset = 4;
char fifthChar = *(foo + offset);

基本上,您在指针foo中添加4并取消引用结果,以便fifthChar保留字符'g'。