簡體   English   中英

將int轉換為int *然后再轉換為int

[英]Converting int to int* then back to int

我錯過了一些明顯的東西,但請考慮以下內容,

int k = 10;
int *p = &k;
int i = (int)p;

以上產生,

warning: cast from pointer to integer of different size

和以下,

int k = 10;
int *p = &k;
int i = p;

原因

warning: initialization makes integer from pointer without a cast

一點谷歌搜索引導我,

將指針轉換為整數

哪個建議使用uintptr_t,

int k = 10;
int *p = &k;
int i = (uintptr_t)p;

上面的工作沒有錯誤沒有警告。 所以我的問題是k是一個int而p是一個指向k的int指針為什么我得到一個錯誤解除引用p?

int k = 10;
int *p = &k;
int i = *p;

注意最后一行的p之前的*。 取消引用指針以獲取它指向的int。

編輯:我不熟悉uintptr_t,但我運行代碼int i =(uintptr_t)p; 存儲到i中的結果是k的內存地址,而不是10.演員告訴編譯器你真的想把地址變成一個整數(所以沒有警告;因為你堅持要編譯器你知道什么你正在做)但不取消引用指針。

你得到一個錯誤,因為你實際上沒有取消引用p ,你只是從int*強制轉換它(強制改變它的類型)。 要取消引用,您需要使用*運算符,如下所示:

int i = *p;

您沒有取消引用指針,因此您將指針的地址分配給int。

int i = *p;

是你最想要的。

你正在使用int來進行指針轉換,而且無法保證兩者甚至再使用相同數量的內存。 實際上它沒有保證在人們使用相同尺寸時使用相同尺寸,但對於大多數平台來說,它恰好正好工作。

由於您在后一個示例中顯式轉換,編譯器認為它不是一個錯誤(或者您為什么要鍵入它?)。 這就是編譯器輸出差異的原因。

請注意,如果您不想將k的內存地址存儲到i中,那么將K值賦入i的正確方法將是

int i = *p;

您將i設置為等於k的地址(這是p保持的)。 地址值是無符號類型。 因此,當從指針進行轉換時,它會抱怨,因為您正在將轉換和無符號值轉換為signed。

另外,指針是基於平台的不同大小的類型,因此32位指針小於64.因此,如果指針是8字節無符號,則將其轉換為4字節簽名。

這應該是它的外觀

int k = 10;
int *p = &k;
int i = *p;

這是我如何看待它

k = 10

p =某個地址

&k =某個地址

* p = 10

uintptr_t不是作為對int進行中間uintptr_t的類型,而是用作這樣的類型。 如果它是在系統上定義的(並且你似乎有它),那么它是無符號整數類型,當你用指針值加載它時,你不會丟失信息。 因此,如果必須, uintprt_t完全使用uintprt_t而不是int 但這應該是罕見的情況,在大多數情況下我敢打賭,這只是一個糟糕的設計的跡象。

無論如何,從一開始int就是一個壞主意。 如果有的話,指針值只是虛擬內存空間中的一個位置,並將其視為有符號值對我來說毫無意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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