1. C语言动态分配二维数组
(1)已知第二维

Code-1

char (*a)[N];//指向数组的指针
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//N,一维数组
free(a);
(2)已知第一维

Code-2

char* a[M];//指针的数组
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<M; i++)
free(a[i]);
(3)已知第一维,一次分配内存(保证内存的连续性)

Code-3

char* a[M];//指针的数组
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
(4)两维都未知

Code-4

char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<m; i++)
{
free(a[i]);
}
free(a);
(5)两维都未知,一次分配内存(保证内存的连续性)

Code-5

char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n;
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
free(a);
2.C++动态分配二维数组
(1)已知第二维

Code-6

char (*a)[N];//指向数组的指针
a = new char[m][N];
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//N,一维数组
delete[] a;
(2)已知第一维

Code-7

char* a[M];//指针的数组
for(int i=0; i<M; i++)
a[i] = new char[n];
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<M; i++)
delete[] a[i];
(3)已知第一维,一次分配内存(保证内存的连续性)

Code-8

char* a[M];//指针的数组
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
delete[] a[0];
(4)两维都未知

Code-9

char **a;
a = new char* [m];//分配指针数组
for(int i=0; i<m; i++)
{
a[i] = new char[n];//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;
(5)两维都未知,一次分配内存(保证内存的连续性)

Code-10

char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空间
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
delete[] a[0];
delete[] a;
多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!
3.静态二维数组作为函数参数传递
如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参数传递,即按照以下的调用方式:
int a[2][3];
func(a);
C语言中将静态二维数组作为参数传递比较麻烦,一般需要指明第二维的长度,如果不给定第二维长度,则只能先将其作为一维指针传递,然后利用二维数组的线性存储特性,在函数体内转化为对指定元素的访问。
首先写好测试代码,以验证参数传递的正确性:
(1)给定第二维长度

Code-11

void func(int a[][N])
{
printf("%d\n", a[1][2]);
}
(2)不给定第二维长度

Code-12

void func(int* a)
{
printf("%d\n", a[1 * N + 2]);//计算元素位置
}
注意:使用该函数时需要将二维数组首地址强制转换为一维指针,即func((int*)a);

转载于:https://www.cnblogs.com/bigshow/archive/2009/01/03/1367661.html

[原创]二维数组的动态分配及参数传递相关推荐

  1. 【C++基础学习】二维数组的动态分配及参数传递

    1. C语言动态分配二维数组 (1)已知第二维 char (*a)[N];//指向数组的指针a = (char (*)[N])malloc(sizeof(char *) * m); printf(&q ...

  2. 如何将二维数组作为函数的参数传递

    如何将二维数组作为函数的参数传递 声明: 如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高 兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批评以及 ...

  3. 二维数组作为形参的参数传递问题[08-0704]-转

    2008-07-04 19:06 以下是网上摘抄的一段: 首先,我引用了谭浩强先生编著的<C程序设计>上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): ...

  4. 二维数组作为函数的参数传递

    如何将二维数组作为函数的参数传递,这是涉及到多维数组时经常要遇到的问题.长期来,我们往往知其然,但不知其所以然.这里简单总结一下.     1.<C程序设计>中讲到:可以用二维数组名作为实 ...

  5. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  6. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  7. C语言二维数组作为函数参数传递

    二维数组存放方式 二维数组在内存中是按行存放的,先存储第一行,在接着存储第二行-.. 二维数组作为函数参数 二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小 ...

  8. 二维数组作为函数参数传递

    二维数组作为函数参数调用过程中: void Fun(**a, m, n) {//.... } //.... Fun(a,m,n); 调用函数过程中,会发现VS报错: //IntelliSense: & ...

  9. C/C++ 指针数组、二维数组

    一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是() 2> 将二维数组当做一维数 ...

最新文章

  1. 3大主流前端框架对比
  2. 为什么说学人工智能一定要学Python?
  3. .net core高并发_高并发下的Node.js与负载均衡
  4. NAR | ZKSCAN3延缓人干细胞衰老的表观遗传机制
  5. 标准盒子与IE盒子的区别
  6. android spp传输速度,Android蓝牙SPP连接似乎在几秒后就已经死了
  7. Fast-RTPS初体验
  8. abp后台任务BackGroundWorker
  9. Maxwell 介绍、安装、部署、运行(MYSQL -> Maxwell -> kafka)
  10. 最通俗易懂的JavaScript入门教程
  11. 托业考试简述 — 托业考试题型、托业考试结构、托业考试考场时间、托业考试学习策略
  12. 如果让你去学习一门新的语言 你是通过什么学习 怎么快速高效学习
  13. B.系数(mod意义下的系数转化+lucas)
  14. 计算机学科发表顶级期刊论文,计算机类顶级期刊_计算机顶级期刊_mcs数学与计算机期刊...
  15. 输出菱形图案(数字版)
  16. Notes from Google Play | Google Play 持续助力您的应用和游戏
  17. ffmpeg给视频添加时间水印
  18. 基于Word的论文多级标题与图表题注的解决办法
  19. 【那些年我们一起看过的论文】之《Real-Time Loop Closure in 2D LIDAR SLAM》
  20. LOFTER72D94FF8E0603DBE38066DB525285F1C

热门文章

  1. 北京 | 蚂蚁集团共享智能团队招聘研究实习生
  2. 旷视南京研究院2020年校招开启!
  3. 【TensorFlow】TensorFlow函数精讲之value()
  4. ACM Fellow发文抨击【同行评审】作弊轻松中顶会
  5. 机器学习(四)高斯混合模型
  6. 2篇word文档比较重复率_论文深耕 | 论文重复率太高怎么办?7个降重技巧收好了!...
  7. Spring Data JPA 写SQL语句也可以如此简单
  8. 最详细的FCN论文笔记
  9. java界面布局都有什么_java入門教程-10.5Java圖形界面之布局設計
  10. 信安教程第二版-第20章数据库系统安全