3

与えられた:SInt16 *samples = NULL;

(char **)(&samples)を宣言しますか?

実際の使用例を表示するように編集します。

CMBlockBufferGetDataPointer(audioBlockBuffer, audioBlockBufferOffset, &lengthAtOffset, &totalLength, (char **)(&samples));
//  CMBlockBufferGetDataPointer(<CMBlockBufferRef theBuffer>, <size_t offset>, <size_t *lengthAtOffset>, <size_t *totalLength>, <char **dataPointer>)
4

3 に答える 3

3

これは、私が 16 ビット short であると想定する配列を、s へのポインターの配列として解釈しますchar。つまり、提供されたショーツが有効なポインターでない場合、深刻な問題が発生します。

于 2012-07-09T00:48:22.227 に答える
3

変数は 1 回だけ宣言されるため、(char **)(&samples)はポインターであり、宣言ではありません。SInt16へのポインタをキャストしますchar**

于 2012-07-09T00:49:05.020 に答える
1

更新:元の質問は単純に尋ねていWhat does (char **)(&samples) declare?たので、元の回答では、その構文の可能な使用法を要約して概説しようとしました。しかしその後、これは へのパラメータ用であることが明らかになりましたCMBlockBufferGetDataPointer。しかし、完全を期すために、元の回答を残します。

元の答え:

この構文には、2 つの可能な解釈のうちの 1 つがあります。まず、この構文は、 a のポインターへのポインターにSInt16キャストされた aのポインターへのポインターとして使用できますchar。ところで、Apple では、これらのポインタへのポインタに対して間接参照という用語を使用しています。または、2 番目に、これは の配列SInt16へのポインターにキャストされた の配列へのポインターである可能性がありcharます。これは使い方次第(char **)&samplesです。

最初の解釈に焦点を当てると、あなたの例では、変数は(符号付き短整数)へのポインター (または直接参照)であるsamplesと定義されています。したがって、そのポインタのアドレスです。これは、ポインタを a のポインタ (間接参照) に渡す必要があるあらゆる状況で適切に使用できます。(SInt16 *)SInt16&samplessamplesSInt16(SInt16 **)

ポインタへのポインタ、つまり間接参照を使用する場所に関しては、オブジェクトにメモリを割り当てるメソッドがあり、この新しいオブジェクトへの参照でポインタの 1 つを更新する必要がある場合によく使用されます。 . この構造の最も一般的な Cocoa の例は、(NSError **). この例は、Apple のError Handling Programming Guideで確認できます。

あなたの例で奇妙なのは、 への間接参照 (または の配列へのポインタ)をキャスト&samplesして、 、間接参照 (または の配列) になることです。これは、改革された C プログラマー全員の背筋をゾッとさせます。これを行う場合、これは少し危険であるため、この構造を使用しているコードに非常に慣れているはずです。しかし、レガシ コードに制約されていることもあります。SInt16SInt16(char **)charchar

于 2012-07-09T02:36:35.097 に答える