唯一指標
在 C 程式中,多個指標可以包含資料的位址。 指標會說為建立資料的 別名 。 當指標指向宣告的變數時,也會建立別名。 下列程式碼片段說明這兩種別名方法:
int iAnInteger=50;
// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;
// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;
在典型的 C 程式中,您可以使用下列定義來指定二進位樹狀結構:
typedef struct _treetype
{
long lValue;
struct _treetype * left;
struct _treetype * right;
} TREETYPE;
TREETYPE * troot;
多個指標可以存取樹狀節點的內容。 這通常適用于未散發的應用程式。 不過,這種程式設計樣式會產生更複雜的 RPC 支援程式碼。 用戶端和伺服器存根需要額外的程式碼來管理資料和指標。 基礎存根程式碼必須解析位址的各種指標,並判斷資料複本代表最新版本。
如果您保證指標是應用程式可以存取記憶體區域的唯一方式,則可以減少處理量。 指標仍然可以有 C 指標的許多功能。 例如,它可以在 null 和非Null 值之間變更,或維持不變。 下列範例將說明這點。 指標在呼叫之前為 null ,並在呼叫之後指向有效的字串:
根據預設,MIDL 編譯器會將 [ unique] 指標屬性套用至不是參數的所有指標。 您可以使用 [ pointer_default] 屬性來變更此預設設定。
唯一指標具有下列特性:
- 它可以有 null值。
- 它可以在呼叫期間從 null 變更為非Null 。 當值變更為非Null時,會在傳回時配置新的記憶體。
- 它可以在呼叫期間從非Null 變更為 Null 。 當值變更為 Null時,應用程式會負責釋放記憶體。
- 值可以從一個非Null 值變更為另一個值。
- 作業中任何其他指標或名稱無法存取唯一指標所指向的儲存體。
- 如果指標沒有 null值,則會將資料寫入現有的儲存體。
下列範例示範如何定義唯一指標。
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(1.0)
]
interface RefPtrInterface
{
void RemoteFn([in, unique] char *ach);
}
在此範例中, ach 參數是字元資料的唯一指標,會傳送至要與 RemoteFn 常式一起處理的伺服器。