Day 10 - Pointer(指标)

Objective-C中的变数分为储存基本资料型态的数值(value)以及指标(pointer)

Pointer 其实就是一个变数而其值代表数值的位置,有点类似地址的概念。要想取得指标可以使用符号(&),它表示内存中的地址访问。

ex.

int a = 10;
NSLog(@"a的值:%i",a);
NSLog(@"a的pointer: %p",&a);

结果:

2021-10-01 17:13:41.847800+0800 TestOC[33699:577420] a的值:10
2021-10-01 17:13:41.847858+0800 TestOC[33699:577420] a的pointer: 0x16d847fcc

Pointer本身是一个characters字串的记忆体位置,ex. 0x16b1bffcc,也就是不管 Pointer 指向的 object 多大,Pointer 的大小都是固定的,大大节省记忆体空间。

声明形式

用来声明指针的是 星号(*)

type *var-name;

ex.

int a = 20;
int *ip;
    
ip = &a;
    
NSLog(@"a的pointer: %p",&a);
    
NSLog(@"储存ip值的地址: %p",ip);
    
NSLog(@"*ip的value值: %d",*ip);

结果:

2021-10-01 17:24:11.709216+0800 TestOC[33825:583275] a的pointer: 0x16d717fcc
2021-10-01 17:24:11.709264+0800 TestOC[33825:583275] 储存ip值的地址: 0x16d717fcc
2021-10-01 17:24:11.709299+0800 TestOC[33825:583275] *ip2的value值: 20

我们尝试把一个值传入方法,然後修改其值,返回後再传回原本的值,来比较看看他们的差异。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    int i = 5;
    NSLog(@"i address is %p",&i);
    i = [self addOne:i];
    NSLog(@"i address is %p",&i);
}


- (int) addOne: (int) x {
    x += 1;
    NSLog(@"x is %i",x);
    NSLog(@"x address is %p",&x);
    return x;
}
2021-10-01 17:27:12.611427+0800 TestOC[33861:585111] i address is 0x16d6f7fcc
2021-10-01 17:27:12.611473+0800 TestOC[33861:585111] x is 6
2021-10-01 17:27:12.611500+0800 TestOC[33861:585111] x address is 0x16d6f7f8c
2021-10-01 17:27:12.611532+0800 TestOC[33861:585111] i address is 0x16d6f7fcc

可以发现到 x 与 i 的位置不同,这代表 x又多开了一个记忆体位置

如果不传入"值",改成 pointer 的话

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    int i = 5;
    NSLog(@"i address is %p",&i);
    i = [self addOne:&i];
    NSLog(@"i address is %p",&i);
}


- (int) addOne: (int *) x {
    *x += 1;
    NSLog(@"x is %i",*x);
    NSLog(@"x address is %p",x);
    return *x;
}

结果:

21-10-01 17:35:31.573388+0800 TestOC[34045:590438] i address is 0x16b27ffcc
2021-10-01 17:35:31.573437+0800 TestOC[34045:590438] x is 6
2021-10-01 17:35:31.573474+0800 TestOC[34045:590438] x address is 0x16b27ffcc
2021-10-01 17:35:31.573506+0800 TestOC[34045:590438] i address is 0x16b27ffcc

可以发现记忆体位置都相同,指标都指向同一个位置


讨论

总结下来

int ip
int *ip

两种的差异感觉像是value typereference type的差别,使用指针带入其他参数中,从头到尾修改的值都是在同一个完成(前面的例子,x 跟 i 的位置都一样,没有生成新的值)


参考资料

https://codebbkaf.blogspot.com/2017/07/objective-c-pointer.html
http://tw.gitbook.net/objective_c/objective_c_pointers.html


<<:  JavaScript学习日记 : Day19 - Class继承

>>:  Day 16 - SNMP、Banner Grabbing 与 Firewall Rules

Laravel 实作 Webhooks

前言 那时候找不到完全符合需求的可以直接用或改,所以最後自己写了一个,供大家参考。 根据我爬文,要用...

Day01 前言x初识CTF

前言 大家好,我是 Yvonne,大家也可以叫我凡凡 :) 这次是我第一次参加 IT 邦帮忙铁人赛,...

【D9】厨具熟练後制作精致:使用历史资料的Kbar做MA(移动平均线)图

前言 当熟悉了历史资料,发现有更厉害的K线,这时候就要善用工具,好好的料理资料一番,这次我们来用K线...

欢迎与简单的command

Print HI@Someone 接下来,我们开始写一些可以用的指令吧~~ 好比说,打招呼之类的,而...

[DAY 25] 估计学生战力

如同前几天所说 「估计战力」是可以依照想看的不同能力去做的 例如我们把题目先依照章节进行分类 再去看...