数组的复习
三个月不学习,就会忘记很多东西。这里对数组做一下复习。
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的语法。