Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c (char**)(&;samples)声明了什么?_Objective C_Ios - Fatal编程技术网

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示例应用程序。我只是想弄清楚如何获取缓冲区数据。