宏定义
#define DZNSLog(format, ...) printf("%s\n", [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);
1. 值拷贝
值拷贝:虽然赋值相同,但地址不同。
a = 10;
b = 10;
DZNSLog(@"%d -- %p",a,&a);
DZNSLog(@"%d -- %p",b,&b);
/**
打印:
10 -- 0x7ffeefbff4fc
10 -- 0x7ffeefbff4f8
*/
2. 指针拷贝
指针拷贝:p1和p2虽然是同一个对象,但开辟空间地址不同,指针地址也不同。
而p2和p3是p3指针指向p2指向的内存空间,所以是指针不同但内存地址相同。
DZPerson *p1 = [DZPerson alloc];
DZPerson *p2 = [DZPerson alloc];
DZPerson *p3 = p2;
DZNSLog(@"%@ -- %p",p1,&p1);
DZNSLog(@"%@ -- %p",p2,&p2);
DZNSLog(@"%@ -- %p",p3,&p3);
/**
打印:
<DZPerson: 0x10064eb50> -- 0x7ffeefbff4f0
<DZPerson: 0x10064e960> -- 0x7ffeefbff4e8
<DZPerson: 0x10064e960> -- 0x7ffeefbff4e0
*/
3. 数组指针
数组指针:
- 因为数组是连续的,所以数组的地址就是第一个元素的地址。
- 又因为数组是连续的,所以指针相加就是内存偏移,d+1就是数组向右偏移1个元素位置大小,也就是&d[1]。
int c[4] = {1,22,333,4444};
int *d = c;
NSLog(@"%p - %p - %p - %p",&c,&c[0],&c[1],&c[2]);
NSLog(@"%p - %p - %p",d,d+1,d+2);
for (int i = 0; i<4; i++) {
// int value = c[i];
int value = *(d+i);
DZNSLog(@"%d, ",value);
}
NSLog(@"指针 - 内存偏移");
/**
0x7ffeefbff510 - 0x7ffeefbff510 - 0x7ffeefbff514 - 0x7ffeefbff518
0x7ffeefbff510 - 0x7ffeefbff514 - 0x7ffeefbff518
1 == 1
22 == 22
333 == 333
4444 == 4444
*/
*为取内容
,但在定义的时候表示定义一个指针,*p代表地址为p的内存里所存储的数据;
&表示取地址
,每一个变量都有一个对应的存储地址,&a就是a所在的内存地址。
网友评论