关于对数组和指针的测试与分析OC
前言:
这个笔试题想必很多小伙伴都很面熟把,差不多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的更多相关文章
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- 小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器
小猪猪C++笔记基础篇(四) 关键词:数组,Vector. 一.数组与指针 数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据.例如:int a[10],意思就是从a开始 ...
- C/C++中数组与指针的关系探究
数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...
- 深入解析C语言数组和指针
概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...
- Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统
Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本 ...
- 由strcat函数引发的C语言中数组和指针问题的思考
问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...
- C语言 二维数组(指针)动态分配和释放(转)
C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...
- Delphi下使用指针的简单总结(指针的赋值,数组和指针的转换,函数指针的使用)
由于最近公司太忙,好久没有更新我的BLOG了.原来想着写写关于HOOK驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用DELPHI来开发网 ...
- 数组与指针的区别,以及在STL中传递数组/指针
数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...
随机推荐
- matlab sparse函数和full函数用法详解(转)
sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)--将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...
- Tomcat安装及问题排查方法
简介: Apache Jakarta的开源项目 JSP/Servlet容器 安装: 1.1进入 Tomcat 官方下载地址 选择合适版本下载,并解压到本地. (备注)Tomcat 8.5 要求 JDK ...
- JavaSE基础问答
1.JAVA的基本数据类型有哪些? JAVA的基本数据类型分为4类8种,就是整形 byte.short.int.long.浮点型 float 跟double,字符型 char,跟布尔型 true和 f ...
- Git 处理tag和branch的命令
最近想给GitHub 上的项目设置tag,可是使用GitHub Desktop,找了一圈都没找到快速设置Tag 的地方,最后只能通过终端命令来添加了. 想要查看Git 的命令,可以使用 git --h ...
- Scala:集合类型Collection和迭代器
http://blog.csdn.net/pipisorry/article/details/52902549 Scala Collection Scala 集合分为可变的和不可变的集合. 可变集合可 ...
- Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置
最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...
- linux中probe函数传递参数的寻找(下)
点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...
- Leetcode解题-链表(2.2.6)RotateList
1 题目:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. Fo ...
- [uwsgi]使用建议(类似最佳实践)
看了下uwsgi官方的一个使用建议,之前都是直接参考了下django文档中那个比较简单的配置或者就写了个能运行的配置,么有注意很多细节问题,这里学习下,把需要的配置添加到项目配置中. 1 http a ...
- 安卓高仿QQ头像截取升级版
观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图: 为了适应大家不同需求,这次打了两个包,及上图 ...