(char **)(& samples)声明了什么?

时间:2012-07-09 00:46:18

标签: objective-c ios

鉴于: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>)

3 个答案:

答案 0 :(得分:3)

它将我假设为16位短路的数组解释为char s的指针数组。这意味着如果提供的短裤不是有效的指针,那你就陷入了困境。

答案 1 :(得分:3)

鉴于变量仅被声明一次,(char **)(&samples)是指针表达式,而不是声明。它会向SInt16投射char**指针。

答案 2 :(得分:1)

更新:最初的问题只是问What does (char **)(&samples) declare?因此,在我的原始答案中,我试图在摘要中概述该语法的可能用途。但后来澄清说这是CMBlockBufferGetDataPointer的参数。但为了完整起见,我会留下原来的答案。

原始回答:

此语法具有两种可能的解释之一。首先,此语法可用作指向SInt16指针的指针,该指针已转换为指向char指针的指针。顺便说一句,Apple使用术语间接引用来指示这些指针。或者,第二,这可能是指向SInt16数组的指针,该数组已被强制转换为指向char数组的指针。这取决于(char **)&samples的使用方式。

着眼于第一个解释,在您的示例中,变量samples被定义为(SInt16 *),指针(或直接引用)被定义为SInt16 (带符号的短整数)。因此&samplessamples指针的地址,它可以在需要将指针传递给SInt16的指针(间接引用)的任何情况下正确使用,即(SInt16 **)

就使用指向指针的位置(间接引用)而言,当你有一个为某个对象分配一些内存的方法时,经常会使用它,并且它需要通过引用来更新你的一个指针。这个新对象。此构造中最常见的Cocoa示例是频繁使用(NSError **)。你可以在Apple的Error Handling Programming Guide中看到这方面的例子。

你的例子有什么奇怪的,就是你正在施放&samples,你对SInt16(或指向SInt16数组的指针)的间接引用是{ {1}},(char **)间接引用(或char数组)。这让我们所有改革过的C程序员都感到震惊。如果你这样做,你应该非常,非常舒服使用这个结构的代码,因为这有点危险。但我意识到我们有时会受到遗留代码的限制。