![](/img/trans.png)
[英]Difference between & (ampersand) and && or | (pipe) and || in Objective-C?
[英]Difference between printing pointer address and ampersand address
int firstInt =10;
int *pointerFirstInt = &firstInt;
printf("The address of firstInt is: %u", &firstInt);
printf("\n");
printf("The address of firstInt is: %p", pointerFirstInt);
printf("\n");
上面的代碼返回以下內容:
The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc
我知道0x7fff5fbff7cc
是十六進制的,但是當我嘗試將該數字轉換為十進制時,它不等於1606416332
。 為什么是這樣? 都不應該都返回相同的內存地址嗎?
原因在於:
如果轉換規范無效, 則行為是undefined 。 288)如果任何參數不是對應轉換規范的正確類型,則行為未定義。
從您的十六進制地址-
The address of firstInt is: 0x7fff5fbff7cc
地址的大小為6個字節長。 但是unsignedint
大小為4個字節。 當您嘗試使用%u
打印地址時,將導致未定義的行為。
因此,請始終使用%p
打印地址。
看來您在64位計算機上工作。 所以你的指針長64位
兩者( &firstInt
和pointerFirstInt
)完全相同。 但顯示方式不同。 "%p"
知道指針是64位的,並以十六進制顯示它們。 "%u"
顯示十進制數,並假定為32位。 因此只顯示了一部分。
如果將1606416332
轉換為十六進制,則它看起來像: 0x5FBFF7CC
。 您會看到這是64位地址的下半部分。
編輯:進一步的解釋:
因為printf是一個var-arg函數,所以您賦予它的所有參數都放在堆棧中。 因為在這兩種情況下,您都將8個字節放在上面。 由於Pcs使用Little Endian,因此將較低的字節放在首位。 printf函數解析該字符串並到達%[DatatypeSpecifier]
點,並從堆棧中讀取與DatatypeSpecifier引用的數據類型一樣多的字節。 因此,對於"%u"
它僅讀取4個字節,而忽略其他字節。 由於您寫的是"%u"
而不是"%x"
因此它將以十進制而不是十六進制形式顯示值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.