在Objective C或C中分配指针

use*_*658 1 pointers objective-c ios

NSHost *instance = [NSHost currentHost];
NSString *answer = [instance localizedName];
NSLog(@"%@",answer);
Run Code Online (Sandbox Code Playgroud)

好吧,我知道指针的基础知识,但我对这3行代码有一些疑问.在这个网站上发布类似的问题之后,我得到的答案仍然没有真正回答我的问题.所以,首先,我知道指针需要保存一个地址.但为什么我们不这样做呢?NSHost*instance =&[NSHost currentHost]; 添加&.这是因为只有&显示某事物的地址.

第二个问题[NSHost currentHost]返回什么

它返回其实例的地址吗?如果不是我们如何分配NSHost*instance = [NSHost currentHost]; 这是不对的.

第三个问题,我知道NSString*answer = [instance localizedName]; 返回一个NSString的instane,因为它写在一本书中,我现在用它来完成书中的挑战.在这段代码NSString*answer = [instance localizedName]我们分配指针指针?? 因为[instance localizedName]返回NSString的指针.

Joh*_*rug 14

在教授Objective-C类时,我用这个类比来解释指针的(有些令人困惑的)概念:

1)当你创建一个未初始化的变量时int val;,它会创建一个可以保存整数值的"桶" .存储桶本身具有内存地址.

在此输入图像描述

2)当你分配一个值与变量val = 5;,你这个值放到桶:

在此输入图像描述

3)指针变量(带有前导星号的变量*)就像int *ptr;是一个"桶",它不包含,而是另一个"桶" 的内存地址:

在此输入图像描述

4)对于指针变量,您不是指定另一个存储桶中包含的值,而是指定另一个存储桶的存储器地址.通过将&(&符号)字符放在变量名称前面,可以得到值桶的"桶地址" :

在此输入图像描述

话虽这么说,当一个方法已经返回一个指针变量(如NSString *)时,你已经获得了内存地址,而不必再使用它来请求它&.

为了说明这一点,在这个例子中,我们有2个桶:

NSString *text = @"Test";
Run Code Online (Sandbox Code Playgroud)

第一个桶包含(@"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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Dru*_*erB 5

  1. 你没有添加&,因为currentHost已经返回一个指针.看看它的标题:

    + (NSHost *)currentHost
    
    Run Code Online (Sandbox Code Playgroud)

    它返回一个NSHost*并将其分配给NSHost*.

  2. [NSHost currentHost] 将返回指向NSHost的特定实例的指针.

  3. 这里也是一样的.localizedName返回指向NSString(NSString*)的指针,并将其指定给一个.