[英]Pointer address Arithmetic and Hex/Dec Conversion
我有一個從extern char etext
, end
和edata
獲得的指針地址。 我還使用&<Variable Name>
獲得了變量的地址。 兩者都是十六進制指針地址。
我需要對那些以十進制表示的地址進行算術運算。 我該怎么做? 我需要將地址轉換為十進制的int,以便通過減去地址來找到內存段的大小。
數學是數學。 您基於什么基礎都無關緊要。 無論如何,計算機只能在基座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,而是指向對象的大小。 因此,如果p是指向整數的指針,則p + 1和p之間的地址差可能是4個字節或更多。
如果要對地址進行算術運算,則應使用char指針或將其轉換為此類指針。
沒有“十六進制變量”,而是可以以某種表示形式打印的變量。 此外,該標准不保證int
可以容納指針對象。 如果使用C99或C11,則可以使用可選類型(u)intptr_t
來執行此操作。
uintptr_t n = (uintptr_t)(void *)etext;
兩者都是十六進制指針地址...我需要對那些以十進制表示的地址進行算術運算。 我該怎么做?
十進制和十六進制只是表示形式...顯示數字的方式。 但是,無論我寫10還是0xA,它們仍然是相同的數字。 指針是一個數字,您可以用十進制或十六進制表示該數字,但它仍然只是一個數字。 因此,您可以執行以下操作:
char *foo = "A dog and a cat";
int offset = 4;
char fifthChar = *(foo + offset);
基本上,您將4添加到指針foo
並取消對結果的引用,以便fifthChar
將保留字符'g'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.