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

第四

例如下面的代码:

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;

我一直想知道为什么可以使用字符串指针来做到这一点。

阿斯兰·阿里(Arslan Ali)

好吧,这就是所谓的语法糖我们实际上所看到的;根本不会像引擎盖那样发生。

例如,您编写的代码:

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

当您传入greetingNSLog时,实际上将执行以下代码行。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么打印字符指针会产生字符串而不是内存地址?

来自分类Dev

为什么在Objective-C中将指针*用作字符串而不是整数

来自分类Dev

为什么字符串不是值?

来自分类Java

为什么JVM无法“看到”?字符串池内存中的字符串值重复?

来自分类Dev

C分割字符串函数在字符串末尾返回\ 377而不是\ 0。为什么?

来自分类Dev

为什么字符串指针不指向首地址?

来自分类Linux

在Linux上,为什么字符串文字的内存地址与其他字母这么大?

来自分类Dev

为什么指向c字符串中的元素的指针不只返回该元素?

来自分类Dev

C#:为什么我的字符串返回对象类型而不是它包含的值?

来自分类Dev

为什么我的 for 循环返回字符而不是字符串

来自分类Dev

为什么ListBox.DisplayMember接受字符串值?

来自分类Dev

为什么我的字符串不接受空值?

来自分类Dev

为什么字符串不返回其内存位置?

来自分类Dev

为什么字符串文字不是字符串?

来自分类Dev

为什么在Rust中修改字符串变量时指针的地址没有改变?

来自分类Dev

为什么此函数返回''而不是串联字符串

来自分类Dev

当Decimal()接受字符串而不是float时,为什么精度是准确的?在Python中

来自分类Dev

为什么真相&&“字符串”返回“字符串”

来自分类Java

为什么JVM在字符串池内存中没有“看到”重复的字符串值?

来自分类Dev

为什么dynamic.ToString()返回字符串之间而不是字符串之间的内容?

来自分类Dev

为什么我的对象的值是函数而不是字符串?

来自分类Dev

为什么String引用变量在Java中存储字符串而不是地址?

来自分类Dev

为什么在我的BST遍历中显示指针而不是字符串?

来自分类Dev

为什么字符串类型的默认值是null而不是空字符串?

来自分类Dev

为什么在C中打印字符而不在字符串时使用星号作为指针?

来自分类Dev

为什么在Oracle中接受字符串值之前的加号(+)?

来自分类Java

为什么Kotlin在声明为不可为空的字符串的属性中接受空值?

来自分类Dev

为什么我的字符串被接受为sql db中的int值?

来自分类Dev

为什么C#插值字符串不接受变量填充?

Related 相关文章

  1. 1

    为什么打印字符指针会产生字符串而不是内存地址?

  2. 2

    为什么在Objective-C中将指针*用作字符串而不是整数

  3. 3

    为什么字符串不是值?

  4. 4

    为什么JVM无法“看到”?字符串池内存中的字符串值重复?

  5. 5

    C分割字符串函数在字符串末尾返回\ 377而不是\ 0。为什么?

  6. 6

    为什么字符串指针不指向首地址?

  7. 7

    在Linux上,为什么字符串文字的内存地址与其他字母这么大?

  8. 8

    为什么指向c字符串中的元素的指针不只返回该元素?

  9. 9

    C#:为什么我的字符串返回对象类型而不是它包含的值?

  10. 10

    为什么我的 for 循环返回字符而不是字符串

  11. 11

    为什么ListBox.DisplayMember接受字符串值?

  12. 12

    为什么我的字符串不接受空值?

  13. 13

    为什么字符串不返回其内存位置?

  14. 14

    为什么字符串文字不是字符串?

  15. 15

    为什么在Rust中修改字符串变量时指针的地址没有改变?

  16. 16

    为什么此函数返回''而不是串联字符串

  17. 17

    当Decimal()接受字符串而不是float时,为什么精度是准确的?在Python中

  18. 18

    为什么真相&&“字符串”返回“字符串”

  19. 19

    为什么JVM在字符串池内存中没有“看到”重复的字符串值?

  20. 20

    为什么dynamic.ToString()返回字符串之间而不是字符串之间的内容?

  21. 21

    为什么我的对象的值是函数而不是字符串?

  22. 22

    为什么String引用变量在Java中存储字符串而不是地址?

  23. 23

    为什么在我的BST遍历中显示指针而不是字符串?

  24. 24

    为什么字符串类型的默认值是null而不是空字符串?

  25. 25

    为什么在C中打印字符而不在字符串时使用星号作为指针?

  26. 26

    为什么在Oracle中接受字符串值之前的加号(+)?

  27. 27

    为什么Kotlin在声明为不可为空的字符串的属性中接受空值?

  28. 28

    为什么我的字符串被接受为sql db中的int值?

  29. 29

    为什么C#插值字符串不接受变量填充?

热门标签

归档