指针地址算术和六角/减速转换(Pointer address Arithmetic and Hex/

2019-10-17 15:57发布

我有我从获得的指针地址extern char etextendedata 。 我还获得通过变量地址&<Variable Name> 。 两者都是十六进制的指针地址。

我需要做十进制这些地址算术。 我该怎么办呢? 我需要将地址转换成十进制一个int,所以我可以通过减去地址找到内存段的大小。

Answer 1:

数学是数学。 不要紧,你做什么它的基础。 电脑正在运行只在基地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);


Answer 2:

你可以做算术的指针。 只知道,“单位”是不是1,但尖锐的物体的大小。 因此,如果p是整数在P + 1和p之间的地址之差可以是4字节或更多字节的指针。

如果你想要做算术与地址,你应该使用指针为char或将其转换为这样的指针。



Answer 3:

没有“十六进制变量”,而不是变量,你可以在一定的代表性打印。 此外,该标准并不能保证一个int可以容纳一个指针对象。 如果您使用C99或C11,可以使用可选的类型(u)intptr_t做到这一点。

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


Answer 4:

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

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

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

基本上,你将4指针foo和非关联化的结果,使fifthChar将持有的字符“G”。



文章来源: Pointer address Arithmetic and Hex/Dec Conversion