必威体育iOS 数组与指针的事无巨细分析。iOS 最详尽的辨析(数组与指针)笔试题。

前言:

– (void)viewDidLoad {

[super viewDidLoad];

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

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

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

}

博同伴还很熟悉吧,差不多10独人口发出7独人且未明了之输出的结果是呀吧,或许有明答案的,但是只有理解答案,心里要一头雾水。如果您真不见面那么便请认真看罢本文学习一下吧!

必威体育 1

错误想法:

一部分人看

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

加1减1非就是平衡了么,那一定是看数组首地址,那打印的价肯定是
10,看起是属之(引用宋小宝小品海参炒面一句子话:汤面没被钱,汤面用炒面换得让什么钱?炒面也从未吃钱呀,炒面没吃为什么钱?)但是意义是免一样的。

必威体育 2

指南针是何等加减运算:

– int *p 的说明:将来的指针是依赖于int类型

指南针p + 1 征内存地址会增长4单字节(因为是int占4只字节)

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

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

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

指南针p – n = p当前底地方值 – n * 指向项目所占的字节数

iOS 笔试题.png

数组与指针:

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单字节

前言:

本条笔试题想必很多伴侣都不行熟知把,差不多10单人口产生7单人口非会见召开这道笔试题,或许有知道答案的,但是单知道答案,心里要一头雾水。如果你真正不见面那么就告认真看完本文章读一下咔嚓!

说到底答案解析

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

错误想法:

一部分人看
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);

必威体育 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

要喜欢的伴儿请点一个赞吧,欢迎留言补充和给闹不足之处!

相关文章