iOS 数组与指针经典笔试题
2017-11-01 22:48
169 查看
前言:
这个笔试题想必很多小伙伴都很面熟把,差不多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\如果喜欢的小伙伴请点一个赞吧,欢迎留言补充与给出不足之处!
相关文章推荐
- 经典笔试题:一级指针数组、二级指针数组和三级指针的联合使用详解
- iOS 最详细的解析(数组与指针)笔试题
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】C语言中的指针数组与数组指针
- 指针、数组相关笔试题详解
- 笔试面试算法经典--数组partition调整使数组的左部分单调有序
- 一道关于二维数组和指针数组的C语言笔试题目
- 指针数组 看过的最经典的解析
- C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题
- iOS开发经典笔试面试题汇总(持续更新中)
- 从几道腾讯笔试题谈数组名与指针的思考
- 关于一个C语言的笔试题(数组+指针)
- 经典笔试题:指针详解
- 金山笔试题解析(经典指针)
- 笔试面试算法经典-打印n个数组中最大的topk
- iOS  日记2 --字符串赋值给指针与数组的区别
- 数组指针 原理以及三个经典C程序的解惑 C知识回顾第二天
- C语言中 字符、数组、字符串、指针——学习IOS你必须了解
- iOS笔记之_C语言数组与指针
- C++指针数组和数组指针--笔试面试系列
- C语言的一个笔试题:指针与数组的问题