zoukankan      html  css  js  c++  java
  • 指针详解

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

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

    #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;

    }

  • 相关阅读:
    网页的摘要信息
    自我介绍
    DIV和SPAN的区别
    软件工程简介
    设置层的漂移
    构建之法现代软件工程
    手机验证码的相关知识
    Python2和Python3的区别
    我的第一个练习
    结对编程后传之做汉堡
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4878072.html
Copyright © 2011-2022 走看看