newbie objective c指针问题"*"语法

dub*_*eat 0 pointers objective-c

我经常收到有关将错误的指针类型传递给函数的警告,我只想一劳永逸地理解这一点.

这两者有什么区别?

CFURLRef *ref=(CFURLRef *)sourceURLArray[0];

CFURLRef ref=(CFURLRef )sourceURLArray[0];
Run Code Online (Sandbox Code Playgroud)

第一个实际引用数组中对象的内存地址吗?第二个是否复制了它?

我目前追求的主要代码风格是拥有一系列值或对象.我希望能够使用这些值,将它们传递给其他函数,而无需更改原件.

从我所尝试的2个函数声明开始,如下所示.

- (void) loadAudioFileIntoMemory:(CFURLRef *)address channel:(int) value row:(int) value2;

- (void) loadAudioFileIntoMemory:(CFURLRef )address channel:(int) value row:(int) value2;
Run Code Online (Sandbox Code Playgroud)

有什么区别?

Dan*_*son 5

CFURLRef已经是一个指针 - 它被声明为:

typedef const struct __CFURL *CFURLRef;
Run Code Online (Sandbox Code Playgroud)

通常,在声明用于保存URL的变量时,您将需要使用CFURLRef 不带*的类型.大多数(或全部?)Core Foundation对象都是以这种方式定义的,您可以假设一个结尾的类型Ref是指针.

因此,如果您想要一个包含10个URL的数组,您可以编写如下内容:

CFURLRef sourceURLArray[10];
//... populate the array.
// Get a particular URL out of the array:
CFURLRef ref = sourceURLArray[0];
Run Code Online (Sandbox Code Playgroud)

也许是什么让这个略显混乱是Objective-C的对应,NSURL,确实需要*做出一个指针与所有Cocoa对象.所以你写的东西如下:

NSURL *sourceURLArray[10];
...
NSURL *url = sourceURLArray[0];
Run Code Online (Sandbox Code Playgroud)

最后,你可能会发现它更容易使用NSArrayNSURL对象比使用普通的C数组:

NSArray *sourceURLs = [NSArray arrayWithObjects:...];
NSURL *url = [sourceURLs objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)