更新:元の質問は単純に尋ねていWhat does (char **)(&samples) declare?
たので、元の回答では、その構文の可能な使用法を要約して概説しようとしました。しかしその後、これは へのパラメータ用であることが明らかになりましたCMBlockBufferGetDataPointer
。しかし、完全を期すために、元の回答を残します。
元の答え:
この構文には、2 つの可能な解釈のうちの 1 つがあります。まず、この構文は、 a のポインターへのポインターにSInt16
キャストされた aのポインターへのポインターとして使用できますchar
。ところで、Apple では、これらのポインタへのポインタに対して間接参照という用語を使用しています。または、2 番目に、これは の配列SInt16
へのポインターにキャストされた の配列へのポインターである可能性がありchar
ます。これは使い方次第(char **)&samples
です。
最初の解釈に焦点を当てると、あなたの例では、変数は(符号付き短整数)へのポインター (または直接参照)であるsamples
と定義されています。したがって、そのポインタのアドレスです。これは、ポインタを a のポインタ (間接参照) に渡す必要があるあらゆる状況で適切に使用できます。(SInt16 *)
SInt16
&samples
samples
SInt16
(SInt16 **)
ポインタへのポインタ、つまり間接参照を使用する場所に関しては、オブジェクトにメモリを割り当てるメソッドがあり、この新しいオブジェクトへの参照でポインタの 1 つを更新する必要がある場合によく使用されます。 . この構造の最も一般的な Cocoa の例は、(NSError **)
. この例は、Apple のError Handling Programming Guideで確認できます。
あなたの例で奇妙なのは、 への間接参照 (または の配列へのポインタ)をキャスト&samples
して、 、間接参照 (または の配列) になることです。これは、改革された C プログラマー全員の背筋をゾッとさせます。これを行う場合、これは少し危険であるため、この構造を使用しているコードに非常に慣れているはずです。しかし、レガシ コードに制約されていることもあります。SInt16
SInt16
(char **)
char
char