打印內(nèi)存地址
float x = 32.1;
NSString *string = [NSString stringWithFormat:@"%@", @{@"title":@"xxx", @"num":@(x)}];
NSLog(@"%@,%p", string, string);
-
%p
:打印第二個string的內(nèi)存地址
輸出參數(shù)
以NSError
為例:NSError
一般會經(jīng)由方法的“輸出參數(shù)”返回給調(diào)用者。如下代碼所示
- (BOOL)doSomething:(NSError **)error
傳遞給方法的參數(shù)是個指針肉拓,而該指針本身又指向另外一個指針房午,而這另外一個指針指向NSError
對象。這樣一來疏日,此方法不僅能有普通的返回值,而且還能經(jīng)由“輸出參數(shù)”把NSError
對象回傳給調(diào)用者。用法如下:
- 使用方法
NSError *error = nil;
BOOL ret = [object doSomething:&error];
if (error) {
//There was an error
}
- 內(nèi)部原理
該方法通過下列代碼把NSError
對象傳遞到“輸出參數(shù)”中顷牌。如下圖所示,方框中代表的是當(dāng)前內(nèi)存中的實際數(shù)據(jù)塞淹,非該數(shù)據(jù)所在的內(nèi)存地址窟蓝。
輸出參數(shù)
或者可以按下圖理解。error存儲的是一個地址饱普,error是指向NSError
類型的指針运挫。
輸出參數(shù)
- (BOOL)doSomething:(NSError **)error
{
//Do something that may cause an error
if (/*therr was an error*/) {
if (error) {
//Pass the 'error' through the out-parameter
*error = [NSError errorWithDomain:domain code:code userInfo:userInfo];
}
return NO;
} else {
return YES;
}
}
- 補(bǔ)充說明
實際在使用ARC時,編譯器會把方法簽名中的NSError **
轉(zhuǎn)換成NSError *__autoreleasing*
套耕,即指針?biāo)傅膶ο髸诜椒▓?zhí)行完畢后自動釋放谁帕。
指針的指針
即指針的存儲地址可存放在指針中
指針的指針.png
- 舉例
如圖所示
int ival = 1024;
int *pi = &ival;
int **ppi = π
訪問結(jié)構(gòu)體成員
struct AAA {
int a;
int b;
}
struct AAA structA;
struct AAA *structB;
//用法
//定義的結(jié)構(gòu)體如果是指針,訪問成員時就用->
//定義的結(jié)構(gòu)體如果是變量冯袍,訪問成員時就用.
//structA.a
//structB->a
size_t
typedef unsigned int size_t //size_t的定義
- 根據(jù)
size_t
的字面意思看以看出匈挖,它是用來描述一個數(shù)據(jù)類型所占的內(nèi)存大小的。因此需要保證能夠存的下任何一種數(shù)據(jù)類型康愤。 - 是
sizeof()
的結(jié)果類型
NSString中打印特殊字符#%"等
label.text = [NSString stringWithFormater:@"%d%%",10];//10%
label.text = [NSString stringWithFormater:@"/"%d/"",10];//"10"