const修飾符修飾的對象的內存地址是不可變的;
注意:
(1)const修飾的對象不絕對是常量(除幾個特殊狀況外, 能夠理解爲常量)
(2)const修飾的對象不絕對是隻讀的
(3)關鍵是內存地址, 內存地址是不可變的bash
NSString * string1 = @"string1";
NSLog(@"1 --- 變量的內存地址: %p", string1);
NSLog(@"&1 --- 指針的內存地址: %p", &string1);
string1 = @"string1***string";
NSLog(@"2 --- 變量的內存地址: %p", string1);
NSLog(@"&2 --- 指針的內存地址: %p",&string1);
輸出結果:
1 --- 0x110087c20
&1 --- 0x7ffedfdfe4b0
2 --- 0x110087c80
&2 --- 0x7ffedfdfe4b0
複製代碼
從輸出結果能夠看出: 改變字符串變量:
(1)指針的內存地址沒有改變;
(2)變量的內存地址改變了;app
NSString * const string1 = @"string1";
NSLog(@"1 --- 變量的內存地址: %p", string1);
NSLog(@"&1 --- 指針的內存地址: %p", &string1);
string1 = @"string1***string";//報錯: Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong'
複製代碼
從報錯信息能夠看出: 由於const修飾了字符串變量string1, 因此string1就是一個常量了, 不能再改變它的值了, 不然會報錯的;ui
NSString const * string1 = @"string1";
NSLog(@"1 --- 變量的內存地址: %p", string1);
NSLog(@"&1 --- 指針的內存地址: %p", &string1);
string1 = @"string1***string";
NSLog(@"2 --- 變量的內存地址: %p", string1);
NSLog(@"&2 --- 指針的內存地址: %p",&string1);
輸出結果:
1 --- 變量的內存地址: 0x1038c4c20
&1 --- 指針的內存地址: 0x7ffeec5c14b0
2 --- 變量的內存地址: 0x1038c4c80
&2 --- 指針的內存地址: 0x7ffeec5c14b0
複製代碼
從輸出結果能夠看出: const修飾指針時: (1)指針的內存地址沒有改變, (2)變量string1的內存地址改變了, 變量的值是能夠改變的.spa
const NSString * string1 = @"string1";
NSLog(@"1 --- 變量的內存地址: %p", string1);
NSLog(@"&1 --- 指針的內存地址: %p", &string1);
string1 = @"string1***string";
NSLog(@"2 --- 變量的內存地址: %p", string1);
NSLog(@"&2 --- 指針的內存地址: %p",&string1);
輸出結果:
1 --- 變量的內存地址: 0x10e7cfc20
&1 --- 指針的內存地址: 0x7ffee16b64b0
2 --- 變量的內存地址: 0x10e7cfc80
&2 --- 指針的內存地址: 0x7ffee16b64b0
複製代碼
從輸出結果能夠看出: const修飾NSString等同於修飾 *;指針
NSMutableString * const variable = @"string".mutableCopy;
NSLog(@"1 --- 變量的內存地址: %p",variable);
NSLog(@"&1 --- 指針的內存地址: %p",&variable);
[variable appendString:@"___variable"];//改變變量內存中的內容
NSLog(@"2 --- 變量的內存地址: %p",variable);
NSLog(@"&2 --- 指針的內存地址: %p",&variable);
//variable = @"mString".mutableCopy; //報錯:Cannot assign to variable 'variable' with const-qualified type 'NSMutableString *const __strong'
輸出結果:
1 --- 變量的內存地址: 0x600000ef80c0
&1 --- 指針的內存地址: 0x7ffee91eb4b8
2 --- 變量的內存地址: 0x600000ef80c0
&2 --- 指針的內存地址: 0x7ffee91eb4b8
複製代碼
從輸出結果能夠看出:const修飾可變字符串的變量時:
(1)能夠改變變量內存中的內容(內存地址不改變);
(2)變量的內存地址不改變;
(3)變量不能夠指向其餘的內存code
NSMutableString const *variable = @"string".mutableCopy;
NSLog(@"1 --- 變量的內存地址: %p",variable);
NSLog(@"&1 --- 指針的內存地址: %p",&variable);
[variable appendString:@"___variable"];//改變變量內存中的內容
NSLog(@"2 --- 變量的內存地址: %p",variable);
NSLog(@"&2 --- 指針的內存地址: %p",&variable);
variable = @"mString".mutableCopy;
NSLog(@"3 --- 變量的內存地址: %p",variable);
NSLog(@"&3 --- 指針的內存地址: %p",&variable);
輸出結果:
1 --- 變量的內存地址: 0x600003931590
&1 --- 指針的內存地址: 0x7ffeeb6b04b8
2 --- 變量的內存地址: 0x600003931590
&2 --- 指針的內存地址: 0x7ffeeb6b04b8
3 --- 變量的內存地址: 0x6000039314d0
&3 --- 指針的內存地址: 0x7ffeeb6b04b8
複製代碼
從輸出結果能夠看出:const修飾可變字符串的指針 *時:
(1)指針的內存地址始終保持不變;
(2)可變字符串能夠修改內存中的內容(內存地址不改變);
(3)可變字符串能夠指向其餘的內存(內存地址改變)對象
const NSMutableString * variable = @"string".mutableCopy;
NSLog(@"1 --- 變量的內存地址: %p",variable);
NSLog(@"&1 --- 指針的內存地址: %p",&variable);
[variable appendString:@"___variable"];//改變變量內存中的內容
NSLog(@"2 --- 變量的內存地址: %p",variable);
NSLog(@"&2 --- 指針的內存地址: %p",&variable);
variable = @"mString".mutableCopy; //報錯:Cannot assign to variable 'variable' with const-qualified type 'NSMutableString *const __strong'
NSLog(@"3 --- 變量的內存地址: %p",variable);
NSLog(@"&3 --- 指針的內存地址: %p",&variable);
輸出結果:
1 --- 變量的內存地址: 0x600000344210
&1 --- 指針的內存地址: 0x7ffeee6724b8
2 --- 變量的內存地址: 0x600000344210
&2 --- 指針的內存地址: 0x7ffeee6724b8
3 --- 變量的內存地址: 0x600000370d20
&3 --- 指針的內存地址: 0x7ffeee6724b8
複製代碼
從輸出結果能夠看出:const修飾NSMutableString等同於const修飾可變字符串的指針;內存