前言:
這個筆試題想必很多小夥伴都很面熟把,差不多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] = ;
上面的陣列佔16個位元組(原因:每個int型別佔4個位元組,這個陣列有4個int型別,所以佔16個位元組)
arrayname就是陣列名
陣列名 :表示陣列首元素的位址,相當於乙個指向陣列首元素的指標
相信你已經有點矇圈了,我們在進一步解釋一下:
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] = ;
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
對陣列和指標的思考
最近學習了一點彙編和作業系統的知識,看的過程中對陣列和指標有了一些不同的新的認識,陣列到底是什麼。先貼 看看現象 段1 include void main 段2 include void main 這兩段 在vs2015和code blocks上編譯均沒有錯誤。段1在vs上甚至會有執行結果輸出!結果...
C 陣列指標和指標陣列的分析
基本知識 當然我們一切都是從最簡單的內建型別開始,最後我會做一些推廣。先看一下基本的形式,我們從這裡起步 指標 int a 10 int p a 指標的指標 int b 20 int p b int p2p p 簡單陣列 int c 10 整數陣列,含有10個整數元素 file 也就是說每乙個元素都...
對於檔案的大小計算和對陣列指標和指標陣列的理解
陣列指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。指標陣列 定義 int p n 優先順序高,先與p結合成為乙個陣列,再由int 說明這是乙個整型指標陣列,它有n個指...