Convert two dimension array

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

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

法 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

时间: 2024-11-05 17:30:48

Convert two dimension array的相关文章

java.lang.UnsupportedOperationException: Can&#39;t convert to dimension: type=0x1

遇到这个bug: 末尾是解决方法.  E/AndroidRuntime: FATAL EXCEPTION: main                                                                         Process: com.XX.XX.XX, PID: 7055                                                                         java.lang.Runt

UnsupportedOperationException:can&#39;t convert to dimension :typx=0x1

at android.content.res.TypeArray.getDimensionPixelSize(TypeArray.java:463) 今天在给项目做适配运行项目时遇到这个错误,错误发生的原因及解决方法 原因:由于在利用@dimen/xxx来获取值的时候,而xxx在dimen文件中没有定义导致这个错误 自己的项目bug复现原因:  因为需要在三套设备上进行适配,所以对一个xml文件所需要的dimen值也分了三个,如图 比如,a.xml文件在设置height="@dimen/a_he

java.lang.UnsupportedOperationException: Can&#39;t convert to dimension: type=0x12

最近使用Android Studio开发一个新项目,刚做完几个界面,跑在android 5.0上面很正常,因为都是挺简单的布局,本以为应该不存在兼容性问题(Flag啊). 偶然用了一个4.x的实机测试,发现杯具了,直接报错退出了,发现log里面打出这么一句: java.lang.UnsupportedOperationException: Can't convert to color: type=0x2 难以理解啊,没办法一步一步调试吧. 顺便说一下调试要注意的问题,如果compileSdkVe

2 dimension Array; Table

1 package com.java7; 2 3 class TwoD { 4 public static void main(String[] args) { 5 int t, i; 6 int table[][] = new int[3][4]; 7 8 for(t = 0; t < 3; ++t){ 9 for(i = 0; i < 4; ++i){ 10 table[t][i] = (t*4)+i+1; 11 System.out.print(table[t][i] + "

[GeeksForGeeks] Convert an array to reduced form

Given an array with n distinct elements, convert the given array to a form where all elements are in range from 0 to n-1. The order of elements is same, i.e., 0 is placed in place of smallest element, 1 is placed for second smallest element, - n-1 is

[Immutable.js] Using fromJS() to Convert Plain JavaScript Objects into Immutable Data

Immutable.js offers the fromJS() method to build immutable structures from objects and array. Objects are converted into maps. Arrays are converted into lists. The fromJS() method can also take a reviver function for custom conversions.  Object to Im

Byte Array to NSData——iOS将服务器返回的图片字节数组用UIImageView显示该图像

前言:我现在做的项目中 服务器返回的图片格式是 图片字节数组,需要把字节数组转换成data然后用imageView展示出来.真是服了服务器工程师了!!!折腾半天终于找到答案,记录下来. 下面是stackOverflow中找到的答案: http://stackoverflow.com/questions/11860830/byte-array-to-nsdata Byte Array to NSData up vote10down votefavorite 5 In a WebService JS

[Tips + Javascript] Make a unique array

To make an array uniqued, we can use Set() from Javascript. const ary = ["a", "b", "c", "a", "d", "c"]; console.log(new Set(ary)); We can see that all the duplicated value have been removed,  now

TSPLIB简介与简易解析器实现

背景知识 TSP即Travelling SalesmanProblem(旅行商人问题)的简称.是数学领域中的著名问题之一.有n个城市,一个旅行商人要从其中某一个城市出发,唯一走遍所有的城市,再回到他出发的城市,求最短的路线.这个问题对快递业等行业也非常具有现实意义,当然现实中的TSP一般是动态的,要更为复杂.TSP可以分为两类,一类是对称TSP(Symmetric TSP),另一类是非对称TSP(Asymmetric TSP).区别就在于都市a到b和都市b到a的cost是否相等,相等的就是对称T