我在看為什么你不能對 C 中的指標進行按位運算,有沒有辦法解決這個問題?并注意到大多數回應都說按位操作沒有很好地定義在指標上,因為指標在標準中沒有很好地定義。然而,這從來沒有出現在我的任何系統類中,我不知道指標可以是指標指向的記憶體地址的值。是否有 C 的任何實作,其中指標不表示為指標指向的記憶體地址?
有沒有計劃改變這一點,以便在未來的 C 標準中很好地定義指標?
uj5u.com熱心網友回復:
這里真的絕對沒有問題:
您想對指標進行按位運算嗎?
您參考的鏈接提供了一個通用的解決方案:
https://stackoverflow.com/a/15868352/421195
但是你可以通過鑄造來解決它:
#include <stdint.h> void *ptr1; // Find page start void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)至于 C ,只需使用 reinterpret_cast 而不是 C 風格的強制轉換。
這僅在“指標”的(特定于平臺的!)實作恰好與“無符號整數”的實作匹配時才有效;如果您的特定平臺碰巧有一個“扁平”的記憶體模型。
問:為什么這首先是一個問題?
答:因為“指標”并不總是很容易映射到“unsigned int”(或“unsigned long”)。
示例:16 位 DOS 指標:
- 近指標:用于在 16 位機器上存盤當前段內的 16 位地址
- 遠指標:通常為 32 位。為了使用它,編譯器分配一個段暫存器來存盤段地址,然后分配另一個暫存器來存盤當前段內的偏移量。
- 大指標:通常也是 32 位,但可以訪問外部段。
- 你不能只是天真地“擺弄位”。在遠指標的情況下,段是固定的。在遠指標中,段部分不能修改,但在 Huge 中可以。
“實模式 DOS”只是其中“平面”記憶體模型不容易應用的許多(同樣是特定于平臺的)示例之一。
也可以看看:
- comp.lang.c 常見問題串列 · 問題 5.17
uj5u.com熱心網友回復:
我在看為什么你不能對 C 中的指標進行按位運算,有沒有辦法解決這個問題?并注意到大多數回應都說按位操作沒有很好地定義在指標上,因為指標在標準中沒有很好地定義。
這是對該問題的答案所說的內容的糟糕描述。在他們實際的東西做的說是,你不能對指標進行位操作,因為
- 標準說你不能
- 它不會有用或沒有意義
- [對指標的按位運算] 的語意沒有很好的定義
- 該標準對指標的表示沒有強加要求
從中得到的主要資訊是您不能對指標執行按位運算,因為語言規范沒有定義這種運算的含義。為什么會這樣?您認為處理地址位的意義或意義是什么?如果有的話,結果會指向什么?在什么條件下結果必須是有效的?
然而,這從來沒有出現在我的任何系統類中,我不知道指標可以是指標指向的記憶體地址的值。
語言規范用物件地址標識指標值,但語言規范所指的不一定是可以用作需要地址的 CPU 指令的運算元的物件型別。有一些不同的 C 實作。
您似乎還假設了一個平面地址空間,因此將“地址”解釋為(單個)數字是合理的。已經存在并且仍然存在并非如此的機器架構。
即使考慮對 C 指標執行按位運算也需要在錯誤的抽象級別上進行思考。
有沒有計劃改變這一點,以便在未來的 C 標準中很好地定義指標?
指標已經針對它們打算服務的目的進行了很好的定義。它們不是整數,也不打算被視為整數。這不太可能改變,因為它不會起到有用的作用。他們的陳述不太可能比現在更詳細,因為那樣會適得其反。
uj5u.com熱心網友回復:
是否有 C 的任何實作,其中指標不表示為指標指向的記憶體地址?
通常,不,這是指標的基本思想。您可以將NULL視為我們在邏輯上用作不是地址的東西的指標的示例。在安全背景關系中,可以加密指標或將低位用作動態分析的標簽。這是一個例子。因此,在這些背景關系中,指標仍然表示地址,但靜止時可能看起來不像地址。
有沒有計劃改變這一點,以便在未來的 C 標準中很好地定義指標?
該標準非常清楚指標代表什么。在第 6.2.5 節中,它描述了一個指標如下
指標型別可以從函式型別或物件型別派生,稱為參考型別。指標型別描述了一個物件,其值提供對被參考型別的物體的參考。從參考型別 T 派生的指標型別有時稱為“指向 T 的指標”。
因此,任何不參考物件的指標的使用都是對標準的誤用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/342868.html
上一篇:為什么這個C代碼輸出1而不是0?
下一篇:我可以參考C 中的指標嗎?
