關於對陣列和指標的測試與分析OC

2021-07-15 06:30:37 字數 1834 閱讀 5027

前言:

這個筆試題想必很多小夥伴都很面熟把,差不多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個指...