陣列
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...