探究二维数组
来源:互联网 发布:ps cc mac怎么安装啊 编辑:程序博客网 时间:2024/06/05 03:56
1. 引言
对N x M的二维数组来讲,设其数组名为array
。指针array
指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据。
2. 二维数组声明和定义
2.1 静态分配内存
int array[3][10]; //定义int array[3][10] = {{0},{0},{0}}; //初始化extern int array[3][10]; // 声明在其他的位置存在变量arrayclass Animal{ public: int array[3][10]; // 仅仅是声明变量array,直到定义了Animal对象,才进行内存的分配};
声明和定义的区别:
声明仅仅是告知编译器存在一个变量叫做XXX,但是不分配内存;而定义除了声明变量,还要分配内存。
定义和初始化的区别:
初始化是在程序声明的地方进行定义,既是声明又是定义,但是又不同的是,它强调第一次声明的时候进行定义(内存分配)。
2.2 动态分配内存
方法一 :
分配N个地址指针,并在循环中为每个指针分配M个
int
大小的内存.
#include <stdlib.h> // 必须包含该 头文件,里面定义了malloc的实现 int ** array = (int **) malloc( N * sizeof(int *) ); for (int k=0;k<N;k++) array[k] = (int *)malloc( M * sizeof(int) );
方法二 :
分配N个地址指针,但统一分配
M*N
个int
大小内存,之后为每个指针指定其一位数组起始地址.
#include <stdlib.h> int ** array = (int **) malloc( N * sizeof(int *) ); array[0] = (int *) malloc( M * N * sizeof(int) ); for (int k=1;k<N;k++) array[k] = array[0]+M*k; // array[k] = array[k-1]+M;
上述两种方法的区别在于:
方法一在内存中分配的区域有可能是不连续的;而方法二则在内存中的一片连续区域为该数组分配空间。
方法三:
通过一维数组模拟二维数组,即是,实际声明和定义的是一位数组,只是将其看做二维数组。在这中间要进行下标转换。
如对于模拟的NxM数组,访问其第i行,第j列元素时,在一维数组中对应的位置是i*M+j
。
#include <stdlib.h> int * array = (int *) malloc( M * N * sizeof(int) ); for (int i=0;i<N;i++) for (int j=0;j<M;j++) printf("%d", arrar[i*M+j]);
3. 二维数组作为形参的声明方式
在函数的定义中,可以用二维数组名作为实参或者形参。此时,当二维数组当作参数的时候,必须指明数组所有的维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列。
方式一:
在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大小说明,如:
void Func(int array[3][10]); void Func(int array[][10]);
二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
void Func(int array[][]); // this is the wrong declare type
方式二:
将数组名当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址。
例如:
void Func(int array[3][10]); void Func(int array[][10]);
变为:
void Func(int **array, int row, int column);
在转变后的函数中,array[i][j]
这样的式子是不对的。因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为,把array[i][j]
这样的式子手工转变为 *((int*)array + column*i + j);
注意:
1)不能只指定一维而不指定第二维,下面写法是错误的:
void Func(int array[3][]);
2)实参数组维数可以大于形参数组,例如形参数组定义为
void Func(int array[3][10]);
而实参数组定义为:
int array[5][10];
说明:
编译器在进行编译时,并不关注形参中第一维数字的大小,其只需知道第二位或者高维的大小,用来对传入的参数进行维度划分,确定是第几行第几列。
- 探究二维数组
- 探究二维数组的传递
- 探究二维数组与指针的关系
- 探究下二维数组与指针
- 【C++】:C++的一道二维数组问题探究
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- 二维数组
- iOS图片拉伸技巧—— resizableImageWithCapInsets
- 2015.12.9模拟赛总结
- Unsupervised Representation Learing with Deep Convolutional Generative Adversarial Networks
- maven的依赖范围
- 【郑轻】[1755]Statistics!
- 探究二维数组
- 自定义剪切板,UIMenuController的使用
- 论文笔记:《Google MapReduce》
- 求助大神
- LevelDb日知录之四: SSTable文件
- git常用指令合集
- SpringMVC下 Validated 报错
- Git使用教程
- LeetCode Valid Parentheses