美文网首页初见
C语言中的 * 和 &

C语言中的 * 和 &

作者: Dezi | 来源:发表于2020-06-22 13:57 被阅读0次

    宏定义

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

    相关文章

      网友评论

        本文标题:C语言中的 * 和 &

        本文链接:https://www.haomeiwen.com/subject/iuthmhtx.html