指针

指针经典题

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

    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的占用字节数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,855评论 3 44
  • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*...
    冰吉凌阅读 8,704评论 0 18
  • 前言:指针是 C语言一个重要概念,也是C 语言的一个重要特色。使程序简洁、紧凑、高效。指针乃是C之精华。 数据在内...
    潇湘候晨雪阅读 4,181评论 0 0
  • 指针 指针是什么 为了了解指针的概念,我们先来看一个小故事。话说福尔摩斯派华生到威尔爵士居住的城堡去取回一个重要的...
    去留无意hmy阅读 3,573评论 0 1
  • 指针p的加减法运算 指针p + Np里面存储的地址值 + N * 指针所指向类型的占用字节数 指针p - Np里面...
    JaromeHuang阅读 1,360评论 0 1

友情链接更多精彩内容