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 され、呼び出しの後に有効な文字列を指します。
null 値と null 以外の値の間でポインターを変更する
既定では、MIDL コンパイラは[一意の] ポインター属性を、パラメーターではないすべてのポインターに適用します。 このデフォルト設定は、[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 ルーチンで処理されるサーバーに送信される文字データへの一意のポインターです。