关于对数组和指针的测试与分析OC
来源:互联网 发布:2选1数据选择器原理图 编辑:程序博客网 时间:2024/06/03 20:56
这个笔试题想必很多小伙伴都很面熟把,差不多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中关于一位数组与指针和二维数组与指针的一点总结
- OC 中数组和指针
- 关于指针的指针和二维数组
- 对多维数组与指针的理解
- 对指针与数组名的理解
- 对数组名与指针的认识
- oc中对指针、对象和%@符号的理解
- C语言中关于数组与指针和字符串与指针的小结
- 关于函数指针数组与返回数组指针的函数
- 关于函数指针数组与返回数组指针的函数
- 关于函数指针数组与返回数组指针的函数
- 关于指针数组与数组指针的总结
- poj 2251 Dungeon Master 简单队列与BFS
- 聚类 - 1 - 聚类介绍
- Java内存区域与内存溢出
- Win7 64Bit + VS2012 + openBLAS0.2.18
- Oracle学习记录整理笔记1-数据备份
- 关于对数组和指针的测试与分析OC
- hdu 5723 (最小生成树 + 树上的期望)
- 使用JMeter3.0实战之分布式并发测试以及web API接口测试
- OPENCV 3.0.0 win10 vs2013 配置
- Winform--文件上传到服务器
- 制定你的创业计划
- ubuntu安装systemtap
- 聚类 - 2 - K-means算法,K中值聚类
- ANDROID应用性能调优的技术点