iOS 最详尽的分析(数组与指针)笔试题。iOS 数组与指针的详尽剖析。

必威体育 1

前言:

– (void)viewDidLoad {

[super viewDidLoad];

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

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

NSLog(@”%d”, *(p – 1));

}

很多伙伴都生熟稔吧,差不多10独人口出7独人且未明白者输出的结果是什么吧,或许有理解答案的,但是单纯理解答案,心里要一头雾水。如果您真的不见面那么即便请求认真看了本文学习一下吧!

必威体育 2

错误想法:

一部分人认为

NSLog(@”%d”, *(&arrayName + 1 – 1));

加1减1免纵平衡了么,那必然是看数组首地址,那打印的价值肯定是
10,看起是联网的(引用宋小宝小品海参炒面一句话:汤面没为钱,汤面用炒面换得吃什么钱?炒面也尚未被钱啊,炒面没吃为啊钱?)但是意义是无相同的。

iOS 笔试题.png

指南针是安加减运算:

– int *p 的说:将来底指针是恃于int类型

指南针p + 1 证明内存地址会助长4只字节(因为凡int占4独字节)

如果是 double *p 指针p +
1内存地址会增长8单字节(因为是double占8只字节)

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

指南针p + n = p当前的地点值 + n *对类型所占的字节数

指南针p – n = p当前的地点值 – n * 指向品种所占据的字节数

前言:

是笔试题想必很多侣都蛮熟稔把,差不多10独人口来7独人口无会见做这道笔试题,或许有了解答案的,但是单理解答案,心里还是一头雾水。如果您真不会见那么便请认真看完本文章读一下吧!

数组与指针:

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);

探下面的出口结果:

2016-07-17 21:46:00.845 数组与指针笔试题[1861:196315] 0x7fff53a7ca30
0x7fff53a7ca34

2016-07-17 21:46:00.846 数组与指针笔试题[1861:196315] 0x7fff53a7ca30
0x7fff53a7ca40

我们打输出的结果好知晓arrayName 与
&arrayName的地点是同样的,而(arrayName + 1) 与 (&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个字节

错误想法:

部分人当
NSLog(@"%d", *(&arrayName + 1 - 1));
加1减1无就是平衡了么,那自然是造访数组首地址,那打印的值肯定是 10,
圈起是搭的(引用宋小宝小品海参炒面一句子话:汤面没让钱,汤面用炒面换得为啊钱?炒面也绝非吃钱啊,炒面没吃为啊钱?)但是意义是休平等的。

末段答案解析

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

指南针是什么样加减运算:

  • 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);

必威体育 3

打印值.png

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

使爱的同伴请点一个赞吧,欢迎留言补充及受出不足之处!

相关文章