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 位短路的数组解释为指向chars 的指针数组。这意味着,如果提供的短裤不是有效的指针,那么你就有大麻烦了。

于 2012-07-09T00:48:22.227 回答
3

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

于 2012-07-09T00:49:05.020 回答
1

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

原答案:

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

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

就您在何处使用指向指针的指针(间接引用)而言,当您有一个将为某个对象分配一些内存的方法并且它需要使用对这个新对象的引用来更新您的一个指针时,经常使用它. 这种结构最常见的 Cocoa 示例是频繁使用(NSError **). 您可以在 Apple 的错误处理编程指南中看到这方面的示例。

您的示例的奇怪之处在于,您将&samples对 a 的间接引用SInt16(或指向 数组的指针SInt16)转换为 a (char **)char间接引用(或数组char)。这让我们所有经过改革的 C 程序员感到不寒而栗。如果你这样做,你应该对使用这个结构的代码非常非常满意,因为这有点危险。但我意识到我们有时会受到遗留代码的限制。

于 2012-07-09T02:36:35.097 回答