本質啊本質之四 陣列的本質

2021-04-13 12:29:32 字數 2195 閱讀 2372

陣列

1.「陣列是同型別的聚合」

2.定義乙個陣列,如:

type x [ n ] ,

意思是記憶體裡有

n個連續的

type

型變數,連續的排列在一起。

x 是第乙個元素的位址,是乙個立即數,是右值,不是變數。

x = = &x[0] .

(這是編譯器處理的,因為當你將

x 賦值給乙個指標時  , 編譯器實際上就用的

&x[0]

)3.「多維陣列也是一維陣列」,這個說法不是乙個空洞的概念,是實實在在的,從彙編碼來看,多維陣列,無論他看上去多麼複雜,編譯器一律編譯成一維陣列。

int main()

, , };

x[2][1]=66;

}_x$ = -12

……movbyte ptr _x$[ebp], 0

movbyte ptr _x$[ebp+1], 1

movbyte ptr _x$[ebp+2], 2

movbyte ptr _x$[ebp+3], 0

movbyte ptr _x$[ebp+4], 1

movbyte ptr _x$[ebp+5], 2

movbyte ptr _x$[ebp+6], 0

movbyte ptr _x$[ebp+7], 1

movbyte ptr _x$[ebp+8], 2

movbyte ptr _x$[ebp+7], 66

4.無論儲存什麼,記憶體中的樣子都一樣,都是這個鳥樣:

int main()

;

char *** y[3]=;

}_x$ = -4

_y$ = -16

……movbyte ptr _x$[ebp], 1

movbyte ptr _x$[ebp+1], 2

movbyte ptr _x$[ebp+2], 3

movdword ptr _y$[ebp], 0

movdword ptr _y$[ebp+4], 0

movdword ptr _y$[ebp+8], 0

5.「本來面目」

無論什麼型別的陣列,記憶體中的樣子都一樣,都是一維陣列。

其位址都是其陣列名。

獲得其中元素的方法都是:

*** [ num ]

也即:* ( *** + num)

以上面為例:

char x[3]=;

char *** y[3]=;

陣列

x的位址就是x;

陣列y的位址就是y ;

陣列x的第二個元素是:

x [1] ,

即:* ( x + 1 ) 陣列

y的第二個元素是:

y [1] ,

即:* ( y+ 1 )

定義乙個指向陣列的指標,往往受到陣列儲存資料型別的牽扯,比較難確定指標的級數,其實很容易,就是「多一星原則」(也即其內容型別的位址),以上面為例:

char *px=x;

char ****py=y;

定義好後就忘了那些星星吧,把指標當作陣列名來用吧,直接

p[ num ] ,

但是要注意,位址是個變數,是左值,陣列名是個值,是右值。

27 陣列的本質

1 陣列的概念 2 陣列的大小 3 陣列位址與陣列名 4 陣列的盲點 b a 陣列名是常量不可被賦值 return0 a 0x7ffcc046cf30 p 0x7ffcc046cf30 p 0x7ffcc046cf18 sizeof a 20 sizeof p 8 b 0x7ffcc046cf20 ...

陣列的本質分析

陣列是相同型別的變數的有序集合 陣列在一片連續的記憶體空間中儲存元素 陣列元素的個數可以顯示或隱式指定 int a 5 int b 陣列名代表陣列首元素的位址 陣列的位址需要取位址符 才能得到 陣列首元素的位址與陣列的位址值相同 陣列首元素的位址與陣列的位址是兩個不同的概念 陣列名可以看作乙個常量指...

多維陣列本質小結

include stdio.h include stdlib.h include string.h void main33 1 myarray陣列首元素的位址吧 2 myarray是乙個常量指標 3k 3 myarray是乙個陣列指標 int myarray 3 5 直接定義乙個陣列指標 int p...