如何在C中使用一元指针运算符(*)?

时间:2010-11-01 18:43:55

标签: objective-c c pointers

我正在读一本名为Java和C的书:关键差异,为Java开发人员学习Objective-C。 (我的背景是C#/ Java所以指针和管理内存的概念对我来说是新的,所以请耐心等待我)

在第2章中,它解释了这个例子的指针:

int i = 1;
int *iptr;
iptr = &i;
*iptr = 2;

我理解上面的内容,其中*iptr是一个指针,它被分配了i的内存位置,同样来自指针iptr我们可以访问值iptr使用*iptr语法指向。

在本书的下方还有以下片段:

//..    
NSMutableString *z = [[[NSNutableString alloc]init] autorelease];
[z appendString:@"Zombie "];
//...

根据我对第2章的理解,行[z appendString:@"Zombie "]应该是[*z appendString:@"Zombie "],因为我们希望实际的NSMutableString,而不是它的指针,发送消息{{ 1}}!?我知道我错了,有些东西我错过了,请指出正确的方向。

非常感谢,

朱塞佩

4 个答案:

答案 0 :(得分:6)

在Objective-C中,总是使用指向对象的指针(不能在堆栈上创建对象)。消息总是传递给指针(尽管这只是一个抽象 - 在运行时级别完成了更复杂的事情)。

答案 1 :(得分:4)

简单的答案是Objective-C语法与普通C语言不同。

是的,Obj-C对象是使用普通的C语法定义的,因为它实际上是一个指向结构的指针,但在处理Objective-C指令时不使用*运算符。

实际上没有任何东西禁止Objective-C的语义通过其指针向对象发送消息,所以根本不用担心。

在任何情况下,这都适用于每个对象,但有许多typedefs(例如NSInteger)包含原始的结构化C类型。它们可以通过直接使用它们在C中使用,或者通过分配它们。

答案 2 :(得分:2)

可能你不知道

NSMutableString *z = [[[NSNutableString alloc]init] autorelease];

的简化形式
NSMutableString *z;
z = [[[NSNutableString alloc]init] autorelease];

可能现在更清楚了。 正如mipadi所说,在Objective-C中,你总是处理指向对象而不是真实对象的指针(例如有时在C ++中)

答案 3 :(得分:1)

括号表示法[obj message]表示obj是指向对象的指针。因此,*将被表达。