啥都不說了 直接上代碼的
//定義DBLog #define DBLog(fmt, ...) NSLog((@"\nfunction:%s \nline:%d" fmt),__PRETTY_FUNCTION__,__LINE__, ##__VA_ARGS__); #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //二級指針的一般用法 /** * @author 劉俊, 15-08-18 * * 一級指針的傳遞只是值的傳遞,雖然在方法中將singlePointArr初始化了(但是在函數中是屬於局部變量) * *關於一級指針,二級指針的理解,主要:一級指針是對自身值的傳遞,二級指針是對自己地址的傳遞, *第一種情況中,singlPointArr是一個未初始化的數組,也就是該數組指向一個nil,在傳進去initSingleArray中實際是穿了一個nil進去,然後就可以理解爲在該函數中實際是對arr數組的初始化,而arr是一個局部變量,出了函數的作用域之後就消失,所以第一個在外面就沒有值打印出來 *第二種情況,雖然還是一個一級指針,但是因爲已經初始化了,其指向一個已經開闢內存空間的數組,所以穿進函數中的就是指向這片空間的地址,而在函數中修改arr也就是相當於直接操作修改原來的數組,所以在外面打印的時候,數組是改變的 *第三種情況是,數組沒有舒適化,雖然指向的是一個nil,但是傳進函數中的是自己的地址,在函數中直接操作的也就是自己的地址,相當於拿着自己本身在初始化,所以在函數外面打印的是已經初始化的值 //所以對於必須傳得二級指針,外面的變量必須爲nil */ NSArray *singlePointArr = nil; [self initSingleArray:singlePointArr]; DBLog(@"\n1. singlePointArr = %@\n point :%p\n\n",singlePointArr,singlePointArr); //DLog(@"\n1. singlePointArr = %@\n point :%p",singlePointArr,singlePointArr); NSMutableArray *singlePointArr1 = @[@"1",@"2",@"3",@"4",@"5"].mutableCopy; [self changeSingleArray:singlePointArr1]; DBLog(@"\n2.changeSingle: %@ \n point:%p \n\n",singlePointArr1,singlePointArr1); NSArray *doublePointArr = nil; [self initDoubleArray:&doublePointArr]; DBLog(@"\n2.doublePointArr = %@\n point:%p \n\n",doublePointArr,doublePointArr); } //傳一級指針 - (void)initSingleArray:(NSArray *)arr { DBLog(@"\n1.%@\n\n",arr); arr = @[@"one",@"two"]; DBLog(@"\n1. arr = %@\n %p\n\n",arr,arr); } - (void)changeSingleArray:(NSMutableArray *)arr { [arr removeLastObject]; } //傳二級指針 - (void)initDoubleArray:(NSArray **)arr { *arr = @[@"1",@"2"]; DBLog(@"\n2. arr = %@ \n point:%p\n\n",*arr,*arr); } @end