指针详解

以下实例, 以三个典型的面试题, 展示指针的原理;

如果能理解以下实例, 指针就没问题了!!!

#import <Foundation/Foundation.h>

/**

 *  (&array + 1)  VS  (p + 1)  ----  看跨度

 */

void test1 ()

{

    int array[4] = {10, 20, 30, 40};

    

    int *p = (int *)(&array + 1);

    NSLog(@"test1 - %d", *(p - 1));

//    2015-10-14 16:53:42.290 指针的问题[27364:1585274] test1 - 40

}

/**

 *   指针类型 决定其 跨度

 */

void test2 ()

{

    int array[4] = {10, 20, 30, 40};

    

    double *p = (double *)(&array + 1); // 跨越16字节, 指向下一个 10

    NSLog(@"test2 - %d", *(int *)(p - 1)); // 跨越 8字节, 返回 两个元素, 30

    //    2015-10-14 16:53:42.290 指针的问题[27364:1585274] test2 - 30

}

/**

 *   二维数组

 */

void test3 ()

{

    int a[2][3] = {{1, 2, 3}, {10, 20, 30}};

    int *p = (int *)(a + 1);

    NSLog(@"test3 - %d", *(p - 2)); // +12 --- -8

//    2015-10-14 17:13:55.327 指针的问题[27395:1593840] test3 - 2

    

    

    a[0]; // a[0][0]的地址, 指向元素a[0][0]的指针, 指向4个字节的空间

    a[1]; // a[1][0]的地址, 指向元素a[1][0]的指针, 指向4个字节的空间

    a; // a[0]的地址, 指向a[0]的指针, 指向 3 * 4 个字节的空间

    &a; // a 的地址, 指向a 的指针, 指向 6 * 4 个字节的空间

}

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        NSLog(@"Hello, World!");

        

        int array[4] = {10, 20, 30, 40};

        // q - 一个指向 array首元素的指针, 指向四个字节的空间

        int *q = array;

        

        // (*p)[4] - 指向数组的指针, 指向 16 个字节的空间

        int (*q1)[4] = &array;

        

        NSLog(@"%p --- %p", q, q1);

        // +1, 地址跨度不一样

        NSLog(@"%p --- %p", ++q, ++q1);

//        0x7fff5fbff780 --- 0x7fff5fbff780

//        0x7fff5fbff784 --- 0x7fff5fbff790

        

        // 1. 测试 -- 元素指针, 数组指针

        test1();

        

        // 2. 测试 - 二

        test2();

        

        // 3. 二维数组

        test3();

        

        // array, &array, &array[0] 是同一个地址

//        NSLog(@"%p --- %p",array, &array);

//        NSLog(@"%p",&array[0]);

//        NSLog(@"%p",&array[1]);

//        NSLog(@"%p",&array[2]);

//        NSLog(@"%p",&array[3]);

        

        // p -> 数组名, 代表首元素地址, --认为: 指向首元素的地址

        int *p = array;

        // p1 -> 第0个元素的地址

//        int *p1 = &array[0];

        

        for (int i = 0; i < 4; i++) {

//            NSLog(@"%d -- %p",*(p + i), &array[i]);

        }

        

        

    }

    return 0;

}

原文地址:https://www.cnblogs.com/guangleijia/p/4878072.html