变量,指针,对象和内存地址:为什么我会得到这个奇怪的结果?

Tha*_*nks 3 c c++ pointers objective-c

在我认为我已经理解它们如何工作之后,我尝试了这个:

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two

str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, two
Run Code Online (Sandbox Code Playgroud)

指针的值(如str1,str2)是一个内存地址.当您转到该地址时,您将到达存储对象的内存中的"区域".

但是:当我将str2分配给str1时,str1应该具有str2引用的同一对象的内存地址值,对吗?这里奇怪的是,指针的值保持不变(bfffd3cc内存地址),该地址后面的东西会发生变化.这对我来说实际上是完全没有逻辑的;)因为我认为内存地址是对象(或者内存块中对象的主页,是什么).所以我期待这个:

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two

str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3c8, two
Run Code Online (Sandbox Code Playgroud)

否则,我仍然没有明白这一点."指针变量"的值与"实际值"之间的关系,可以说是位于该存储器地址后面的对象.

Mic*_*urr 9

请记住,指针变量本身就是一个变量,所以它有一个地址.因此&str1导致指针变量的地址,并且str1是一个表达式,它导致指针变量保持的任何内容 - 它指向的对象的地址.

假使,假设:

  • 持有NSString"one"的对象位于地址0x00000100
  • 持有NSString"two"的对象位于地址0x00000200

然后你的指针看起来像这样:

初始化时:

str1
0xbfffd3c8  +---------------+
            |               |
            |  0x00000100   |
            |    ("one")    |
            +---------------+

str2
0xbfffd3cc  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+
Run Code Online (Sandbox Code Playgroud)

=======================================

str1 = str2;作业完成后:

str1
0xbfffd3c8  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+

str2
0xbfffd3cc  +---------------+
            |               |
            |  0x00000200   |
            |    ("two")    |
            +---------------+
Run Code Online (Sandbox Code Playgroud)