初见

C语言中的 * 和 &

2020-06-22  本文已影响0人  Dezi

宏定义

#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. 数组指针

数组指针:

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所在的内存地址。

上一篇 下一篇

猜你喜欢

热点阅读