三個月不學習,就會忘記不少東西。這裏對數組作一下複習。數組
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的語法。學習