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 type
跟reference 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
前言 那时候找不到完全符合需求的可以直接用或改,所以最後自己写了一个,供大家参考。 根据我爬文,要用...
前言 大家好,我是 Yvonne,大家也可以叫我凡凡 :) 这次是我第一次参加 IT 邦帮忙铁人赛,...
前言 当熟悉了历史资料,发现有更厉害的K线,这时候就要善用工具,好好的料理资料一番,这次我们来用K线...
Print HI@Someone 接下来,我们开始写一些可以用的指令吧~~ 好比说,打招呼之类的,而...
如同前几天所说 「估计战力」是可以依照想看的不同能力去做的 例如我们把题目先依照章节进行分类 再去看...