鉴于: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>)
答案 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
(带符号的短整数)。因此&samples
是samples
指针的地址,它可以在需要将指针传递给SInt16
的指针(间接引用)的任何情况下正确使用,即(SInt16 **)
。
就使用指向指针的位置(间接引用)而言,当你有一个为某个对象分配一些内存的方法时,经常会使用它,并且它需要通过引用来更新你的一个指针。这个新对象。此构造中最常见的Cocoa示例是频繁使用(NSError **)
。你可以在Apple的Error Handling Programming Guide中看到这方面的例子。
你的例子有什么奇怪的,就是你正在施放&samples
,你对SInt16
(或指向SInt16
数组的指针)的间接引用是{ {1}},(char **)
间接引用(或char
数组)。这让我们所有改革过的C程序员都感到震惊。如果你这样做,你应该非常,非常舒服使用这个结构的代码,因为这有点危险。但我意识到我们有时会受到遗留代码的限制。