例如下面的代码:
NSString *greeting = @"Hello";
NSLog(@"Greeting message: %@\n", 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;
我一直想知道为什么可以使用字符串指针来做到这一点。
好吧,这就是所谓的语法糖。我们实际上所看到的;根本不会像引擎盖那样发生。
例如,您编写的代码:
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的指针,再次在幕后:)
我希望这可以帮助你。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句