前言:

  

  这个笔试题想必很多小伙伴都很面熟把,差不多10个人有7个人不会做这道笔试题,或许有知道答案的,但是仅仅知道答案,心里还是一头雾水。如果你真的不会那就请认真看完本文学习一下吧!

  错误想法:

  有的人认为

  NSLog(@"%d", *(&arrayName + 1 - 1));

  加1减1不就是抵消了么,那肯定是访问数组首地址,那打印的值肯定是 10,看起来是通的(引用宋小宝小品海参炒面一句话:汤面没给钱,汤面用炒面换得给什么钱?炒面也没给钱啊,炒面没吃给什么钱?)但是含义是不一样的。

  指针是如何加减运算:

  - int *p 的解释:将来的指针是指向int类型

  指针p + 1 说明内存地址会加上4个字节(因为是int占4个字节)

  如果是 double *p 指针p + 1内存地址会加上8个字节(因为是double占8个字节)

  - 通过上述解释我们得出一个公式:

  指针p + n = p当前的地址值 + n *指向类型所占用的字节数

  指针p - n = p当前的地址值 - n * 指向类型所占用的字节数

  数组与指针:

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

  上面的数组占16个字节(原因:每个int类型占4个字节,这个数组有4个int类型,所以占16个字节)

  arrayName就是数组名

  数组名 :表示数组首元素的地址,相当于一个指向数组首元素的指针

  相信你已经有点蒙圈了,我们在进一步解释一下:

  NSLog(@"%p %p", arrayName, arrayName + 1);

  NSLog(@"%p %p", &arrayName, &arrayName + 1);

  

  1. arrayName 与 &arrayName

  arrayName 是数组名,所以打印出来是数组首元素的地址

  &arrayName 含义就是数组的地址(等价于指向arrayName数组的指针),因为没增加1,所以数组的地址就是数组首元素的地址所以 arrayName <->&arrayName 打印出的地址是一样的

  2.(arrayName + 1) 与 (&arrayName + 1)

  (arrayName + 1)通过上述解释我们知道(arrayName + 1)指针是指向int类型,所以内存地址会加上4个字节

  (&arrayName + 1)我们知道&arrayName是数组的地址(等价于指向arrayName数组的指针) 因为增加1,这个数组总共占16个字节,所以内存地址会加上16个字节

  最后答案解析

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

  /**

  1.(&arrayName + 1):&arrayName是数组的地址(等价于指向arrayName数组的指针)

  2.增加 1 会往后移动16个字节,开始是4个字节的位置,移动后就是16个字节后面的位置(也就是目前位置是20个字节)

  3.最后又赋值给,int类型的指针p(int类型占4个字节)

  4.所以(p - 1)就是减去4个字节,变成为16个字节的位置,输出的*(p - 1)值为40

  */

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

  NSLog(@"%d", *(p - 1));//输出结果为 40

关于对数组和指针的测试与分析OC的更多相关文章

  1. C语言核心之数组和指针详解

    指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...

  2. 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

    小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...

  3. C/C++中数组与指针的关系探究

    数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...

  4. 深入解析C语言数组和指针

    概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...

  5. Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

    Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本 ...

  6. 由strcat函数引发的C语言中数组和指针问题的思考

    问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...

  7. C语言 二维数组(指针)动态分配和释放(转)

    C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...

  8. Delphi下使用指针的简单总结(指针的赋值,数组和指针的转换,函数指针的使用)

    由于最近公司太忙,好久没有更新我的BLOG了.原来想着写写关于HOOK驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用DELPHI来开发网 ...

  9. 数组与指针的区别,以及在STL中传递数组/指针

    数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...

随机推荐

  1. Node.js HTTPS

    稳定性: 3 - 稳定 HTTPS 是基于 TLS/SSL 的 HTTP 协议.在 Node 里作为单独的模块来实现. 类: https.Server 这是 tls.Server 的子类,并且和 ht ...

  2. 硬盘存储计量单位KB、MB、GB大小换算

    一. 预备知识 1. bit与byte 1. bit(简记为 b) 1 bit = 0 or 1 = one binary 2. byte(简记为 B) 1 byte = 8 bits 1字节,8个二 ...

  3. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore

    @SessionAttribute作用于处理器类上,用于在多个请求之间传递参数,类似于Session的Attribute,但不完全一样,一般来说@SessionAttribute设置的参数只用于暂时的 ...

  4. Android图表库MPAndroidChart(五)——自定义MarkerView实现选中高亮

    Android图表库MPAndroidChart(五)--自定义MarkerView实现选中高亮 在学习本课程之前我建议先把我之前的博客看完,这样对整体的流程有一个大致的了解 Android图表库MP ...

  5. Android艺术开发探索第三章——View的事件体系(上)

    Android艺术开发探索第三章----View的事件体系(上) 我们继续来看这本书,因为有点长,所以又分了上下,你在本片中将学习到 View基础知识 什么是View View的位置参数 Motion ...

  6. 等价于n*n的矩阵,填写0,1,要求每行每列的都有偶数个1 (没有1也是偶数个),问有多少种方法。

    #define N 4 /* * 公式: * f(n) = 2^((n - 1) ^2) */ int calWays(int n) { int mutiNum = (n - 1) * (n - 1) ...

  7. 详解EBS接口开发之库存事务处理采购接收和退货

    (一)接收&退货常用标准表简介 1.1   常用标准表 如下表中列出了与采购接收&退货导入相关的表和说明: 表名 说明 其他信息 RCV_TRANSACTIONS 采购接收事务表 事务 ...

  8. Android之Animation动画各属性的参数意思(二)

    现在就来讲讲Animation里这四个标签的属性. 一.这四个标签alpha.scale.translate.rotate共有的属性为: android:duration        动画持续时间, ...

  9. 14 fragment传值

    两个fragment传值 方式一 布局文件代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  10. 剑指Offer——网易校招内推笔试题+模拟题知识点总结

    剑指Offer--网易校招内推笔试题+模拟题知识点总结 前言 2016.8.2 19:00网易校招内推笔试开始进行.前天晚上利用大约1小时时间完成了测评(这个必须做,关切到你能否参与面试).上午利用2 ...