在教授Objective-C类时,我用这个类比来解释指针的(有些令人困惑的)概念:
1)当你创建一个未初始化的变量时int val;
,它会创建一个可以保存整数值的"桶" .存储桶本身具有内存地址.
2)当你分配一个值与变量val = 5;
,你这个值放到桶:
3)指针变量(带有前导星号的变量*
)就像int *ptr;
是一个"桶",它不包含值,而是另一个"桶" 的内存地址:
4)对于指针变量,您不是指定另一个存储桶中包含的值,而是指定该另一个存储桶的存储器地址.通过将&
(&符号)字符放在变量名称前面,可以得到值桶的"桶地址" :
话虽这么说,当一个方法已经返回一个指针变量(如NSString *
)时,你已经获得了内存地址,而不必再使用它来请求它&
.
为了说明这一点,在这个例子中,我们有2个桶:
NSString *text = @"Test";
第一个桶包含值(@"Test"),第二个桶包含第一个桶的内存地址.或者,再次使用桶类比:@"Test"
在左侧桶中,右侧桶(变量text
)包含左侧桶的内存地址.通过运行这个我们可以看到:
NSLog(@"value: %@, bucket that contains value: %p, bucket that contains the memory address of the bucket containing the value: %p", text, text, &text); // output: value: Test, bucket that contains value: 0x1032f5030, bucket that contains the memory address of the bucket containing the value: 0x7fff5c90bb68
希望这可以帮助!
你没有添加&
,因为currentHost
已经返回一个指针.看看它的标题:
+ (NSHost *)currentHost
它返回一个NSHost*
并将其分配给NSHost*
.
[NSHost currentHost]
将返回指向NSHost的特定实例的指针.
这里也是一样的.localizedName返回指向NSString
(NSString*
)的指针,并将其指定给一个.
在教授Objective-C类时,我用这个类比来解释指针的(有些令人困惑的)概念:
1)当你创建一个未初始化的变量时int val;
,它会创建一个可以保存整数值的"桶" .存储桶本身具有内存地址.
2)当你分配一个值与变量val = 5;
,你这个值放到桶:
3)指针变量(带有前导星号的变量*
)就像int *ptr;
是一个"桶",它不包含值,而是另一个"桶" 的内存地址:
4)对于指针变量,您不是指定另一个存储桶中包含的值,而是指定该另一个存储桶的存储器地址.通过将&
(&符号)字符放在变量名称前面,可以得到值桶的"桶地址" :
话虽这么说,当一个方法已经返回一个指针变量(如NSString *
)时,你已经获得了内存地址,而不必再使用它来请求它&
.
为了说明这一点,在这个例子中,我们有2个桶:
NSString *text = @"Test";
第一个桶包含值(@"Test"),第二个桶包含第一个桶的内存地址.或者,再次使用桶类比:@"Test"
在左侧桶中,右侧桶(变量text
)包含左侧桶的内存地址.通过运行这个我们可以看到:
NSLog(@"value: %@, bucket that contains value: %p, bucket that contains the memory address of the bucket containing the value: %p", text, text, &text); // output: value: Test, bucket that contains value: 0x1032f5030, bucket that contains the memory address of the bucket containing the value: 0x7fff5c90bb68
希望这可以帮助!