在我的代碼中,我有兩個 char 指標,一個指向字串,另一個作為 and 的錯誤strtoumax()指示符strtod()。我目前正在使用型別size_t(又名 unsigned long)來計算它們之間的差異。是否有任何型別旨在專門匹配每臺機器上的指標型別大小?還是我必須自己用宏檢查?
uj5u.com熱心網友回復:
對于指標差異使用ptrdiff_t. 如果您只是想將指標存盤為整數,請使用uintptr_t(或intptr_t)。
uj5u.com熱心網友回復:
在我的代碼中,我有兩個 char 指標,一個指向字串,另一個作為 strtoumax() 和 strtod() 的錯誤指示符。我目前正在使用 size_t 型別(又名 unsigned long)來計算它們之間的差異。
不要那樣做。如果你想要一個指標差異,那么計算一個指標差異:
#include <stdint.h>
// ...
ptrdiff_t difference = p2 - p1;
并注意ptrdiff_t,這是指標差異結果的型別。
如果您想要以位元組而不是單位為單位的差異,則指向型別的大小(包括如果指向的型別不完整,例如void),則首先轉換為指向的指標char:
ptrdiff_t difference_in_bytes = (char *) p2 - (char *) p1;
(char是最小的可尋址存盤單元,但從技術上講,在某些 C 實作中它可能大于 8 位。 CHAR_BIT如果您擔心這種情況,將幫助您弄清楚這一點。)
不要通過轉換為整數并執行整數算術來計算指標差異,因為盡管定義了其行為( /- 有符號整數溢位),但結果的含義卻沒有。
是否有任何型別旨在專門匹配每臺機器上的指標型別大小?還是我必須自己用宏檢查?
是的。里面有和stdint.h的定義,它可以支持往返指標到整數到指標的轉換而不會丟失資料。但是 C 沒有定義將指標轉換為整數所產生的值的含義,因此這些最好用作不透明型別。uintptr_tintptr_t
uj5u.com熱心網友回復:
要將指標存盤為整數,您可以 在 header中使用intptr_t和宣告。uintptr_t<stdint.h>
來自 C 標準(7.20.1.4 能夠保存物件指標的整數型別)
1 以下型別指定有符號整數型別,其屬性是任何指向 void 的有效指標都可以轉換為該型別,然后再轉換回指向 void 的指標,結果將與原始指標進行比較:
intptr_t
以下型別指定了一個無符號整數型別,其屬性是任何指向 void 的有效指標都可以轉換為此型別,然后轉換回指向 void 的指標,結果將與原始指標進行比較:
uintptr_t
這些型別是可選的。
要存盤兩個指標之間的差異,您可以使用ptrdiff_t在 header 中宣告<stddef.h>。
請注意,如果兩個指標都指向同一個陣列的元素或最后一個元素之后的元素,您可能會計算它們之間的差異。否則你會得到未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516828.html
標籤:C指针整数
下一篇:C 回傳另一個類物件
