- 前言
我們知道,在C語(yǔ)言中缘薛,基本數(shù)據(jù)類型做為形參傳遞是無(wú)法直接更改其值的窍育,因?yàn)槭侵祩鬟f,在函數(shù)中更改完畢后系統(tǒng)會(huì)收回為此函數(shù)分配的內(nèi)存能及里面的局部變量宴胧。如果想要更改漱抓,可以通過(guò)指針,根據(jù)地址找到找到對(duì)應(yīng)的值恕齐,然后可以更改乞娄。
- 問(wèn)題
那么問(wèn)題來(lái)了,比如在OC中显歧,拿NSString為特例仪或,我聲明的NSString明明也是NSString* ,并且我傳遞的也是NSString*指針士骤,但是為什么不能更改范删?代碼如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *str = @"made";
NSLog(@"1----%p",str);
NSLog(@"2----%p",&str);
[self stringTestChange:str];
NSLog(@"after - %@",str);
}
- (void)stringTestChange:(NSString *)aString{
NSLog(@"3----%p",aString);
NSLog(@"4----%p",&aString);
aString = @"madeChina";
}
上述打印結(jié)果:
可以看到值并沒(méi)有改變,但是從上述打印拷肌,我們也可以看到到旦,str與aString的值是相同的,但是你會(huì)發(fā)現(xiàn)它們的地址去并不相同巨缘。
也就是說(shuō)添忘,在函數(shù)中aString是重新分配了內(nèi)存空間,地址不一樣若锁,但是它們指向的都是同一塊存儲(chǔ)空間搁骑,當(dāng)再賦于新值給aString的時(shí)候,只不過(guò)是改變了它的指向而已,等函數(shù)結(jié)束后靶病,原str的指向并未發(fā)生任何改變会通。當(dāng)執(zhí)行到打印after時(shí),被改變的指向僅僅是aString娄周,存儲(chǔ)結(jié)構(gòu)大致如下:
所以如果想通過(guò)函數(shù)改變?cè)址槌蓿枰业街赶騭tr的地址。所以更改如下:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSString *str = @"made";
[self stringTestChange:&str];
NSLog(@"after - %@",str);
}
- (void)stringTestChange:(NSString **)aString{
*aString = @"madeChina";
}
這樣再一打印煤辨,是沒(méi)問(wèn)題的裳涛。
- 結(jié)論
為什么這樣可以?因?yàn)槲覀兪紫韧ㄟ^(guò)地址找到了str众辨,然后通過(guò)*str找到了指向made字符串的指針端三,然后重新改變了它的指向,最后就修改完成了鹃彻。
圖示如下:
如有問(wèn)題郊闯,希望指出,一起探討交流蛛株!