1 前言:
字符串是存在字符串常量池里面向楼,然后要是有個(gè)指針想要指向一個(gè)字符串查吊,先會(huì)到字符串常量區(qū)進(jìn)行查找
- 如果沒(méi)有,就在字符串的常量區(qū)創(chuàng)建一個(gè),把指針指向字符串常量區(qū)
- 如果有湖蜕,就直接把指針指向字符串的常量區(qū)逻卖。
所以,相同內(nèi)容的字符串指針昭抒,其指向的內(nèi)存地址都是一樣的评也, 但是這個(gè)些字符串的指針變量的內(nèi)存地址則可以是不同的。
2 驗(yàn)證:
1. 代碼:
@interface ViewController ()
@property (nonatomic,copy) NSString *heap_a;///堆區(qū)的a
@property (nonatomic,copy) NSString *heap_b;///堆區(qū)的b
@end
- (void)viewDidLoad {
[super viewDidLoad];
[self setUP];
}
- (void)setUP {
NSLog(@"---------- 棧區(qū)的字符串 ------");
NSString *a = @"a";
NSString *b = @"a";
NSLog(@"a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",a);
NSLog(@"b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",b);
NSLog(@"&a= %p",&a);
NSLog(@"&b= %p",&b);
NSLog(@".");
NSLog(@"---------- 堆區(qū)的字符串 ------");
self.heap_a = @"a";
self.heap_b = @"a";
NSLog(@"self.heap_a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",self.heap_a);
NSLog(@"self.heap_b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",self.heap_b);
NSLog(@"&a= %p",&_heap_a);
NSLog(@"&b= %p",&_heap_b);
NSLog(@".");
NSLog(@"---------- 常量區(qū)的字符串 ------");
NSLog(@"static_a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",static_a);
NSLog(@"static_b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= %p",static_b);
NSLog(@"&static_a= %p",&static_a);
NSLog(@"&static_b= %p",&static_b);
}
2.打印:
---------- 棧區(qū)的字符串 ------
a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
&a= 0x7fff58a119b8
&b= 0x7fff58a119b0
.
---------- 堆區(qū)的字符串 ------
self.heap_a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
self.heap_b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
&a= 0x7fd6cc6053a0
&b= 0x7fd6cc6053a8
.
---------- 常量區(qū)的字符串 ------
static_a對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
static_b對(duì)應(yīng)的字符串對(duì)應(yīng)的字符常量區(qū)地址= 0x1071f9260
&static_a= 0x1071fce40
&static_b= 0x1071fce48
3 總結(jié):
- 字符串指針指向的地址都在字符串常量區(qū):
從上面打印可以看出所有的指針指向的地址:都在
0x1071f9260
- 棧區(qū) / 常量區(qū) / (屬性)堆區(qū) 字符串指針的地址:
- 指針指向的地址是不一樣的灭返,證明每個(gè)內(nèi)存地址都開(kāi)辟了一個(gè)指針空間盗迟,但是存儲(chǔ)了相同的字符串常量區(qū)的地址
- 字符串常量區(qū),存在常量區(qū)中