指針的運(yùn)算雖然在開(kāi)發(fā)iOS時(shí)運(yùn)用的很少戳鹅,但是身為開(kāi)發(fā)者還是需要了解的,尤其是面對(duì)面試....
指針:
int *p 代表著 名為p的指針是指向int類型
指針p + 1 說(shuō)明內(nèi)存地址會(huì)加上4個(gè)字節(jié)(因?yàn)槭莍nt占4個(gè)字節(jié))
如果是 double *p 指針p + 1內(nèi)存地址會(huì)加上8個(gè)字節(jié)(因?yàn)槭莇ouble占8個(gè)字節(jié))
所以公式為:
指針p + n = p當(dāng)前的地址值 + n *指向類型所占用的字節(jié)數(shù)
指針p - n = p當(dāng)前的地址值 - n * 指向類型所占用的字節(jié)數(shù)
現(xiàn)在我們來(lái)看一道面試題:
請(qǐng)問(wèn)會(huì)輸出什么郑口?
我想好多人會(huì)說(shuō),輸出是“1”
但是
為什么會(huì)輸出4呢盾鳞?我們來(lái)分析一下
1.首先犬性,&arrayName是個(gè)什么東西呢?&arrayName是數(shù)組的地址腾仅,也是數(shù)組首元素的地址
2.這個(gè)arrayName數(shù)組占多少字節(jié)呢乒裆,因?yàn)橛?個(gè)int類型的元素,所以占16個(gè)字節(jié)
3.&arrayName + 1 就相當(dāng)于在&arrayName的地址上加16個(gè)字節(jié)(看最上面的公式)
4.因?yàn)?amp;arrayName 目前在第4個(gè)字節(jié)的位置推励,加上16個(gè)字節(jié)鹤耍,目前來(lái)到了20個(gè)字節(jié)的位置
5.計(jì)算完“&arrayName + 1”之后,又轉(zhuǎn)為“int * ”類型的p验辞,然后算(p-1)
6.這時(shí)候int類型已經(jīng)只占4個(gè)字節(jié)了稿黄,還是套公式,-1相當(dāng)于減去4個(gè)字節(jié)跌造,變成為16個(gè)字節(jié)的位置
7.輸出的*(p - 1)值為4
雖然這么寫代碼杆怕,在公司里會(huì)被亂刀砍死,但是其中的原理我們還是需要清楚的壳贪,牢記指針運(yùn)算的公式即可陵珍。