数组的复习

三个月不学习,就会忘记很多东西。这里对数组做一下复习。

 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的语法。

 

posted @ 2018-07-28 22:13  thomas76  阅读(134)  评论(0编辑  收藏  举报