簡體   English   中英

指針地址算術和十六進制/十進制轉換

[英]Pointer address Arithmetic and Hex/Dec Conversion

我有一個從extern char etextendedata獲得的指針地址。 我還使用&<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM