在使用C时,我试图摆脱一些困惑。
在某种意义上,char *name
使用NSString *name
与使用NSString
一样,指针仍指向第一个内存分配吗?
当然char *name
有很多额外内容,但这不是我的意思,将与NSString *name
合作让我像{{1}}一样工作,这样我就可以未来只需使用指针“名称”吗?
答案 0 :(得分:19)
答案是否定的。
char*
旨在指向一个简单的(或单个)char
数据值数组。
char* myCharPtr = "This is a string.";
//In memory: myCharPtr contains an address, e.g. |0x27648164|
//at address 0x27648164: |T|h|i|s| |i|s| |a| |s|t|r|i|n|g|.|\0|
另一方面,NSString *name
将是一个指向对象的指针,该对象可能具有 lot 附加内容,并且您不能依赖于存储实际字符数据的位置,或者怎么样。它不是编码为ASCII(Sherm Pendley在下面说它是UTF-16),它可能有额外的数据,如字符串的长度等。
NSString* myStringPtr = @"This is an NSString.";
//In memory: myStringPtr contains e.g. |0x27648164|
//at address 0x27648164: |Object data|length|You don't know what else|UTF-16 data|etc.|
您通过其公开的方法更改和访问未知对象,因为您不知道它们在内存中的格式,因此无法直接访问其数据。 (或者因为它们将自己封装起来以隐藏它。)
如果您将NSString
指针声明为NSString *name
,则以后仍然可以使用NSString *name = @"This is a string.";
NSString *sameName = name; //This is pointing to the same object as name
NSLog(@"%@", sameName); //This prints "This is a string.", and if NSStrings were mutable, changing it would change name as well.
//They point to the same object.
指针。这就是我的意思:
{{1}}
答案 1 :(得分:4)
char*
和NSString*
是完全不同的字符串实现。
NSString
只能在Objective C中使用(不是在普通的C中),表示不可变的字符串,基于Unicode字符而且 - 是一个面向对象的类 - 提供了许多方法。此外,它们是引用计数并始终在堆上分配。
char*
只是任何字节数组,其编码没有很好地定义,它是可变的,并且不是面向对象的。可以在堆上(使用char
)或在堆栈上分配malloc
个数组。前者需要调用free
,而后者必须永远不会被释放。
答案 2 :(得分:2)
在某种意义上使用char * name 与使用NSString * name相同 指针仍然存在的感觉 指向第一个内存分配 对吗?
我认为您应该将NSString *名称视为对象的句柄而不是指向对象的指针,因此不要假设它指向第一个内存分配。我认为这将是一个更好的比喻。
答案 3 :(得分:0)
没有
char *是指向字符数组的指针。 NSString是一个指向NSString对象的指针。我找不到它的任何文档,但我相信NSString盒子是一个char *。对NSString * name执行名称[1]将引用NSString对象数组的第二个元素。
答案 4 :(得分:0)
从某种意义上说 - 有点无用的意义,确定 - 它们是相同,因为它们都是指向内存地址的指针类型。然而,这种相似性在实践中并不是非常有用。要使用其中任何一个,您必须考虑它们指向的“事物”的类型,以及如何使用char数组和NSString实例完全不同。即使对于像赋值一样简单的事情,也需要根据Cocoa的内存管理规则处理NSString实例,使用-copy或-retain而不是简单的“foo = bar”赋值。