为什么Objective-C中的字符串指针接受并返回字符串的值而不是内存地址?

时间:2014-04-13 12:51:11

标签: objective-c pointers

例如,在此代码中:

NSString *greeting = @"Hello";
NSLog(@"Greeting message: %@\n", greeting );

Greeting采用字符串的值,而不是地址。它还在NSLog中显示字符串,而不是地址。但是,我认为指针应该像这样使用:

int  var = 20;   /* actual variable declaration */
int  *ip;        /* pointer variable declaration */

ip = &var;  /* store address of var in pointer variable*/

NSLog(@"Address of var variable: %x\n", &var  );

/* address stored in pointer variable */
NSLog(@"Address stored in ip variable: %x\n", ip );

/* access the value using the pointer */
NSLog(@"Value of *ip variable: %d\n", *ip );

return 0;

我一直想知道为什么用字符串指针做这件事是可以的。

2 个答案:

答案 0 :(得分:3)

嗯,这就是所谓的Syntactic Sugar。我们实际看到的是什么;确实没有发生在引擎盖下。

例如,您编写的代码:

NSString *greeting = @"Hello";
NSLog(@"Greeting message: %@\n", greeting );

当您将greeting传递给NSLog时,实际上会执行以下代码行。

NSLog(@"Greeting message: %@\n", [greeting description]); // description is a method defined in NSObject and NSString inherits it.

即使你这样做:

NSString *greeting = @"Hello";

现在,greeting变量不保存字符串的内容,也不能保存它,因为它是一个指针。它只保存存储它的NSString @"Hello"的地址。再次,指针的分配发生在引擎盖下。 C语言的情况也是如此;我们可以在C中编写以下代码,它将编译时没有任何错误:

char *string = "Hello, world!"; 

在C中,字符串"Hello, world!"基本上是一个字符数组,string变量实际上存储了指向该字符数组的指针。

如果你看到NSLog方法的定义,它看起来像这样:

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

它清楚地显示NSLog消息接收NSString指针。但是我们实际上通过了什么?我们在其中传递NSString,但实际传递的是指向该NSString的指针,再次在引擎盖下:)

我希望这会对你有所帮助。

答案 1 :(得分:1)

%@NSObject的字符串格式化程序,调用对象-description方法。如果您想要string对象的指针地址,请尝试%p

NSString *string = @"A string";
NSLog(@"Object contents: %@", string);
NSLog(@"Object address: %p", string);