數組的複習

三個月不學習,就會忘記不少東西。這裏對數組作一下複習。數組

 1 struct Char {
 2 
 3     Char() = default;
 4 
 5     Char(const Char& other) {
 6         printf("Char(const Char& other)");
 7     }
 8     char data_;
 9 };
10 
11 void test1( Char a[][4]) {
12 
13     a[0][0].data_ = 'a';
14     a[1][0].data_ = 'b';
15     a[2][0].data_ = 'c';
16 }
17 
18 void test2( Char a[3][4]) {
19 
20     a[0][0].data_ = 'a';
21     a[1][0].data_ = 'b';
22     a[2][0].data_ = 'c';
23 }
24 
25 void test3( Char (*a)[4]) {
26 
27     a[0][0].data_ = 'a';
28     a[1][0].data_ = 'b';
29     a[2][0].data_ = 'c';
30 }
31 
32 void test4(Char (&a)[3][4]) {
33 
34     a[0][0].data_ = 'a';
35     a[1][0].data_ = 'b';
36     a[2][0].data_ = 'c';
37 }
38 
39 int main(){
40 
41     Char arr[3][4];
42 
43     test1(arr);
44     test2(arr);
45     test3(arr);
46     test4(arr);
47     system("pause");
48 
49     return 0;
50     
51 }
52 
53     

二維數組T[R][C],本質上是由一維數組T[C]拼接成的。
二維數組的名字a,本質上是指針,此指針的類型是:pointer to T[C],   而絕非是pointer to T
仔細考慮就會想到a+1這個指針算數,1這個值確定不是1byte,也不是sizeof(T) byte,而是sizeof(T[N]) bytes!!
a[1][5],  第一行,第五列。
(a+1) 按sizeof(T[N]) 步進1個單位,此時指針類型爲T[N]*
*(a+1) 解地址轉換爲元素T指針類型T*
*(a+1) +5, 按sizeof(T)步進5個單位,此時指針類型T*
*(*(a+1)+5), 解地址,轉換爲T類型函數

咱們能夠看到,test1, test2, test3實際參數所有是Char[4] *類型,函數的實參發生了退化現象。
避免數組退化成指針,用test4的語法。學習

相關文章
相關標籤/搜索