指针

作者: zhazha | 来源:发表于2015-07-08 07:55 被阅读86次

指针经典题

思考:以下小程序,输出结果是多少?

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

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

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

思路分析

首先分析一维数组

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

    NSLog(@"%p %p", numbers, numbers + 1);
    NSLog(@"%p %p", &numbers, &numbers + 1);
  • numbers : 存储的是数组首元素的地址,相当于&numbers[0],等价于指向numbers[0]的指针,所以numbers + 1的跨度是整型数据10所占用的字节数;
  • &numbers : 等价于指向numbers数组的指针,所以&numbers + 1的跨度是整个数组numbers所占用的字节数;

其次分析二维数组

     int numbers[2][2] = {
         {10, 20}, // numbers[0]
         {11, 22} // numbers[1]
        };
  • numbers[0] == &numbers[0][0],相当于一个指向numbers[0][0]的指针;
  • numbers == &numbers[0],相当于一个指向numbers[0]的指针
  • &numbers == 相当于一个指向numbers的指针

最后分析三维数组

    int numbers[2][2][2] = {
        {
            {10, 11},
            {12, 13}
         },
         {
            {14, 15},
            {16, 17}
         }
        };
  • numbers[0][0] == &numbers[0][0][0],相当于是一个指向numbers[0][0][0]的指针
  • numbers[1] == &numbers[1][0],相当于是一个指向numbers[1][0]的指针
  • numbers == &numbers[0],相当于是一个指向numbers[0]的指针
  • &numbers == 相当于是一个指向numbers的指针

解答

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

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

    NSLog(@"%d", *(p - 1));
  • &numbers == 相当于是一个指向numbers的指针的指针,&numbers + 1的跨度为整个数组numbers的字节,(&numbers + 1)指向了数组的末尾
  • (int *)(&numbers + 1)将指向整个数组的指针强转为指针整型的指针,它的跨度为int类型的字节
  • (p - 1)是指向了数据最后一个数据的指针,*p取得得数据是50;

结论

指针p的加减法运算

  • 指针p + N
    • p里面存储的地址值 + N * 指针所指向类型的占用字节数
  • 指针p - N
    • p里面存储的地址值 - N * 指针所指向类型的占用字节数

数组名

  • 存储的是数组首元素的地址
  • 等价于:一个指向数组首元素的指针
  • 数组名 + 1 的跨度:数组首元素的占用字节数

其他结论

  • &num + 1的跨度:num的占用字节数

相关文章

  • 混淆知识点

    1、指针数组&数组指针、常量指针&指针常量、函数指针&指针函数 数组指针&指针数组 数组指针的定义 int (*p...

  • C语言

    C 指针、指针变量、函数指针、指针函数、指针数组、数组指针、C 数组

  • 指针

    普通指针指针的指针 数组指针 函数指针

  • 函数指针

    概念: 指针函数, 函数指针, 指针数组, 数组指针, 指向数组的指针, 指向函数指针数组的指针。

  • C:函数指针的坑

    关于该死的函数指针和指针函数 先来个目录 常量指针、指针常量 数组指针、指针数组 函数指针、指针函数 1、先看第一...

  • C 语言指针

    指针类型:指针的读取长度,指针的读取方向(大小端) 空指针,无类型指针,野指针 常量指针,指向常量的指针 http...

  • 二、C语言基础

    A、指针 指针的概念:指针变量 和 指针 的区别 ?答:指针变量是指针的标记,也可以通过指针变量的标记操作指针内存...

  • 王道程序员求职宝典(十一)指针与引用,树

    指针与引用 指针声明typedef别名类型检查void*指针指向指针的指针函数指针typedef简化函数指针定义初...

  • NDK02

    指针 指针概念 1 .指针变量和指针的区别?答: 指针变量是定义指针的标记,指针就是指向的内存地址。2 .函数指针...

  • 12 C指针

    1、指针定义 2、指针进阶 3、指针使用 4、多级指针 4、指针和数组 5、指针和字符串 6、高级指针之和指向函数的指针

网友评论

      本文标题:指针

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