Objective c (char**)(&;samples)声明了什么?
给定:Objective c (char**)(&;samples)声明了什么?,objective-c,ios,Objective C,Ios,给定:SInt16*samples=NULL (char**)(&samples)声明了什么 编辑以显示实际用例: CMBlockBufferGetDataPointer(audioBlockBuffer, audioBlockBufferOffset, &lengthAtOffset, &totalLength, (char **)(&samples)); // CMBlockBufferGetDataPointer(<CMBlockBufferRef theB
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>)
CMBlockBufferGetDataPointer(audioBlockBuffer、audioBlockBufferOffset、lengthaoffset和totalLength、(char**)(&samples));
//CMBlockBufferGetDataPointer(,,)
它将我假设为16位短字符的数组解释为指向char
s的指针数组。这意味着,如果提供的空头不是有效的指针,那么你就有大麻烦了 由于变量只声明一次,因此(char**)(&samples)
是指针表达式,而不是声明。它将一个SInt16
指针投射到char**
更新:最初的问题只是问(char**)(&samples)声明了什么?
,因此,在我最初的回答中,我试图在摘要中概述该语法的可能用法。但随后澄清,这是针对CMBlockBufferGetDataPointer
的参数。但为了完整起见,我将保留我的原始答案
原始答案:
此语法有两种可能的解释之一。首先,此语法可用作指向SInt16
指针的指针,该指针已转换为指向char
指针的指针。顺便说一句,苹果公司对这些指针使用了间接引用这个术语。或者,第二,这可能是指向SInt16
数组的指针,该数组已转换为指向char
数组的指针。这取决于如何使用此(char**)&samples
关注第一种解释,在您的示例中,变量samples
被定义为(SInt16*)
,一个指向SInt16
(有符号短整数)的指针(或直接引用)。因此,&samples
是samples
指针的地址,可以在需要将指针传递到SInt16
的指针(间接引用)的任何情况下正确使用,即(SInt16**)
就使用指向指针的指针而言,它是一种间接引用,当您有一个方法将为某个对象分配一些内存,并且它需要用对这个新对象的引用更新您的一个指针时,经常使用它。这种构造最常见的例子是频繁使用(NSError**)
。你可以在苹果的网站上看到这样的例子
您的示例的奇怪之处在于,您正在将&samples
、对SInt16
的间接引用(或指向SInt16
数组的指针)转换为(char**)
、一个char
间接引用(或一个char
数组)。这让我们所有经过改革的C程序员都不寒而栗。如果您这样做,您应该非常非常熟悉使用此结构的代码,因为这有点危险。但我意识到,我们有时会受到遗留代码的限制。我有一个难题:dasblinkenlight、Linuxios和Robert Ryan的每个答案都有我想要的解释。但从我各自的观点来看,这两个都不是完全的。所以,我现在将对每个答案进行投票…请看我对dasblinkenlight的评论。请看我对dasblinkenlight的评论。罗伯特·瑞安:你的答案是>>25分!!!!。我得再读一遍。但我现在有了一个更好的画面……我相信在我的例子中,它是“指向SInt16数组的指针,它已被转换为指向char数组的指针”。我用实际使用的语法更新了我原来的问题。如果你能对此发表评论。我真的很感激。啊,我现在明白了。但是在这种情况下,char*samples=NULL
不是指针的正确声明,以匹配CMBlockBufferGetDataPointer定义吗?那么就不需要使用(char**)强制转换。就我个人而言,如果我能摆脱强制转换,我会更加自信,不会意外地错误引用数据。@Robert Ryan:这来自苹果的SpeakHere示例应用程序。我只是想弄清楚如何获取缓冲区数据。