例如,在此代码中:
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;
我一直想知道为什么用字符串指针做这件事是可以的。
答案 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);