码迷,mamicode.com
首页 > 其他好文 > 详细

Convert two dimension array

时间:2016-05-30 23:21:35      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

  二维数组的传递有许多易忘点,也伴随着许多陷阱,没避开的话总会让编译器抱怨。

  闲来无事,为日后莫忘,便整理此笔记。

法 1:  传递带列数的二维数组。

 

 1 const int row = 2;  
 2 const int col = 3;
 3 
 4 int matrix[][col] = { {0,1,2},{3,4,5} };
 5 
 6 void display(int matrix[][col])
 7 {
 8     for( int i = 0; i != row; i++ )
 9     {
10         for( int j = 0; j != col; j++ )
11         {
12             cout<<matrix[i][j]<<" ";
13         }
14         cout<<endl;
15     }
16 }

 

 法 2: 传递一维指针和数组的列数

 

 1 void display(int* matrix,int col)
 2 {
 3     for( int i = 0; i != row; i++ )
 4     {
 5         for( int j = 0; j != col; j++ )
 6         {
 7             cout<<*(matrix+i*col+j)<<" ";
 8         }
 9         cout<<endl;
10     }
11 }
12 
13 int main()
14 {
15     display(matrix[0],col); //display(&matrix[0][0],col);
16     return 0;
17 }

 

法 3:传递指向数组的指针

 

 1 void display(int (*matrix)[col])
 2 {
 3     for( int i = 0; i != row; i++ )
 4     {
 5         for( int j = 0; j != col; j++ )
 6         {
 7             cout<<*(*(matrix+i)+j)<<" ";
 8         }
 9         cout<<endl;
10     }
11 }
12 
13 int main()
14 {
15     display(matrix);  //二维数组名传递二维数组的首地址( 指向数组长度为col的指针 int(*)[3] )
16     return 0;
17 }

 

   实际上,这三种方式并无多大区别。

   都可以理解成一个指向固定长度数组的一维指针。

   e.g.   int *matrix   -> [0,0] [0,1] [0,2] ...... 当行数为2时,依次解引获取地址里的内容。 实际上数组开辟的内存是连续排列的。这就解释了法2中 ‘  cout<<*(matrix+i*col+j)<<" "; ’的解引方式了。

  基本知识应该不难掌握。

  现在让我们来做一些有趣的事情~

拓展 1:

 1 typedef int matrixType[row][col];  //定义一个 2 * 3 的矩阵类型
 2 
 3 matrixType myMatrix = { {0,1,2},{3,4,5} };
 4 
 5 void display(matrixType* myMatrix)  //指向矩阵类型的指针
 6 {
 7      for( int i = 0; i != row; i++ )
 8     {
 9         for( int j = 0; j != col; j++ )
10         {
11             cout<<*(*(matrix+i)+j)<<" ";
12         }
13         cout<<endl;
14     }
15 }
16 
17 int main()
18 {
19     display(&myMatrix);  
20     return 0;
21 }

再看看另一种定义二维数组的方式。

拓展 2:

 

 1 typedef int colType[col];       //colType是数组长度为 col 的一维数组(指针)类型
 2 typedef colType matrixType[row];    //matrixType是 row * col 的二维数组类型 
 3 
 4 matrixType myMatrix = { {0,1,2},{3,4,5} };
 5 
 6 void display(colType* myMatrix)  //等价于 int (*matrix)[col]
 7 {
 8      for( int i = 0; i != row; i++ )
 9     {
10         for( int j = 0; j != col; j++ )
11         {
12             cout<<*(*(matrix+i)+j)<<" ";
13         }
14         cout<<endl;
15     }
16 }
17 
18 int main()
19 {
20     colType* matrix_ptr = myMatrix;
21     display(matrix_ptr);  //display(myMatrix);
22     return 0;
23 }

 

   以上都是静态二维数组传递方式。

 

   附加上动态开辟二维数组的方法。

拓展 3:

 

 1 int main()
 2 {
 3     int** arr_2D;
 4     int row = 2;  //可用cin获得
 5     int col = 3;
 6 
 7     arr_2D = (int**)malloc(row*sizeof(int*));//arr_2D = new int*(row);
 8 
 9     for( int i = 0; i != row; i++ )
10     {// 开辟行内存
11         *(arr_2D+i) = (int*)malloc(col*sizeof(int));
12     }
13 
14      for( int i = 0; i != row; i++ )
15     {
16         for( int j = 0; j != col; j++ )
17         {
18            cin>>arr_2D[i][j];
19         }
20     }
21 
22     for( int i = 0; i != row; i++ )
23     {
24         for( int j = 0; j != col; j++ )
25         {
26             cout<<arr_2D[i][j]<<" ";
27         }
28     }
29 
30      for( int i = row-1; i >=0; i-- )
31      {
32          free(arr_2D[i]);
33      }
34      free(arr_2D);
35     return 0;
36 }

 

 二维数组的开辟是先开辟行内存,再开辟列内存。释放时顺序相反,先释放列内存,再释放行内存。

  具体可参考大神的解析~  http://blog.csdn.net/morewindows/article/details/7664479

       

 

Convert two dimension array

标签:

原文地址:http://www.cnblogs.com/win-D-y/p/5544154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!