iOS 数组与指针经典笔试题

  
  

前言:

这个笔试题想必很多小伙伴都很面熟把,差不多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\

如果喜欢的小伙伴请点一个赞吧,欢迎留言补充与给出不足之处!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值