本文转载的是CSDN大大MoreWindows的博客

在C/C++中动态分配二维数组可以先申请一维的指针数组,然后该数组中的每个指针再申请数组,这样就相当于二维数组了,但是这种方法会导致每行可能不相邻,从而访问效率比较低。如何申请连续的二维数组了?本文将分别三个方面讲解:

一.动态申请列大小固定的二维数组

二.C语言中动态申请连续的二维数组

三.C++语言中动态申请连续的二维数组

一.动态申请列大小固定的二维数组

首先如果二维数组的列大小固定,那么很简单,可以用申请一维数数组再其指针强制转化成为二维数组指针即可。详见代码:

//列大小固定的二维数组可以申请一维数据并将指针强转成二维数组

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

#include int main()

{

printf(" 列大小固定的二维数组可以申请一维数据并将指针强转成二维数组\n");

printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");

//列值固定

const int MAXCOL = 3;

int nRow;

printf("请输入二维数组的行数(列值固定为%d): ", MAXCOL);

scanf("%d", &nRow);

//申请一维数据并将其转成二维数组指针

int *pp_arr = new int[nRow * MAXCOL];

int (*p)[MAXCOL] = (int(*)[MAXCOL])pp_arr;

//为二维数组赋值

int i, j;

for (i = 0; i < nRow; i++)

for (j = 0; j < MAXCOL; j++)

p[i][j] = i + j;

//输出二维数组

for (i = 0; i < nRow; i++)

{

for (j = 0; j < MAXCOL; j++)

printf("%5d", p[i][j]);

putchar('\n');

}

//释放资源

delete[] pp_arr;

return 0;

}

运行结果如下所示:

二.C语言中动态申请连续的二维数组

上面的方法虽然方便,但必须要求列的大小固定。下面先来试下在C语言中如何动态申请连续的二维数组。可以采用多申请一些指针,然后这一些指针分别指向后面数据区中对应的位置,如一个3*4的int类型数组,我们先申请大小为sizeof(int*) * 3 + 3 * 4 * sizeof(int)的一维数组设为arr。然后arr[0]存放指向arr + sizeof(int*) * 3这个位置的指针,arr[1]存放指向arr + sizeof(int*) * 3 + 4 * sizeof(int)这个位置的指针, arr[2]存放指向arr + sizeof(int*) * 3 + 2 * 4 * sizeof(int)这个位置的指针。下面用图展示指向的示意:

详细代码如下,由于指针操作有点小复杂,请读者耐心看:

//C语言中动态的申请二维数组 malloc free

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

#include #include #include //动态申请二维数组

template T** malloc_Array2D(int row, int col)

{

int size = sizeof(T);

int point_size = sizeof(T*);

//先申请内存,其中point_size * row表示存放row个行指针

T **arr = (T **) malloc(point_size * row + size * row * col);

if (arr != NULL)

{

memset(arr, 0, point_size * row + size * row * col);

T *head = (T*)((int)arr + point_size * row);

while (row--)

arr[row] = (T*)((int)head + row * col * size);

}

return (T**)arr;

}

//释放二维数组

void free_Aarray2D(void **arr)

{

if (arr != NULL)

free(arr);

}

int main()

{

printf(" C语言中动态的申请二维数组 malloc free\n");

printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");

printf("请输入行列(以空格分开): ");

int nRow, nCol;

scanf("%d %d", &nRow, &nCol);

//动态申请连续的二维数组

int **p = malloc_Array2D(nRow, nCol);

//为二维数组赋值

int i, j;

for (i = 0; i < nRow; i++)

for (j = 0; j < nCol; j++)

p[i][j] = i + j;

//输出二维数组

for (i = 0; i < nRow; i++)

{

for (j = 0; j < nCol; j++)

printf("%4d ", p[i][j]);

putchar('\n');

}

free_Aarray2D((void**)p);

return 0;

}

运行结果如下:

三.C++语言中动态申请连续的二维数组可以看出我们已经成功实现了在C语言中动态申请连续的二维数组,如果上面的程序不使用int类型而使用string类这种类型,那会有什么后果了?肯定的说,由于没有调用构造函数和析构函数,程序绝对会造成内存泄露。因此要做下改进,下面给出在C++语言中动态申请连续的二维数组的代码,有些C++语法可能平时见得少,但其实这些语法在STL里面运用还是比较多的,有兴趣的童鞋应该掌握下。

//C++语言中动态的申请二维数组 new delete

//By MoreWindows-(http://blog.csdn.net/MoreWindows)

#include #include #include #include using namespace std;

//动态申请二维数组

template T** new_Array2D(int row, int col)

{

int size = sizeof(T);

int point_size = sizeof(T*);

//先申请内存,其中sizeof(T*) * row表示存放row个行指针

T **arr = (T **) malloc(point_size * row + size * row * col);

if (arr != NULL)

{

T *head = (T*)((int)arr + point_size * row);

for (int i = 0; i < row; ++i)

{

arr[i] = (T*)((int)head + i * col * size);

for (int j = 0; j < col; ++j)

new (&arr[i][j]) T;

}

}

return (T**)arr;

}

//释放二维数组

template void delete_Array2D(T **arr, int row, int col)

{

for (int i = 0; i < row; ++i)

for (int j = 0; j < col; ++j)

arr[i][j].~T();

if (arr != NULL)

free((void**)arr);

}

int main()

{

printf(" C++语言中动态的申请二维数组 new delete\n");

printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");

printf("请输入行列(以空格分开): ");

int nRow, nCol;

scanf("%d %d", &nRow, &nCol);

//动态申请连续的二维数组

string **p = new_Array2D(nRow, nCol);

//为二维数组赋值

int i, j;

for (i = 0; i < nRow; i++)

for (j = 0; j < nCol; j++)

{

char szTemp[30];

sprintf(szTemp, "(第%d行,第%d列)", i, j);

p[i][j] = szTemp;

}

//输出二维数组

for (i = 0; i < nRow; i++)

{

for (j = 0; j < nCol; j++)

printf("%s ", p[i][j].c_str());

putchar('\n');

}

delete_Array2D(p, nRow, nCol);

return 0;

}

运行结果如下:

二维数组循环赋值c语言,C/C++ 定义并赋值二维数组相关推荐

  1. c语言字符指针初始化赋值,C语言_指针变量的赋值与运算,很详细详解

    指针变量的赋值 指针变量同普通变量一样,使用之前不仅要定义说明, 而且必须赋予具体的值.未经赋值的指针变量不能使用, 否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址, 决不能赋予任何其它数据 ...

  2. python求二维数组的鞍点_C语言程序,找出一个二维数组的鞍点。

    什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...

  3. 二维ising模型概率c语言_盘点近几年在二维材料中发现的铁磁性

    [引语] 二维材料:整理二维材料方面知识,让大家了解的更全面. 材料人现在已经推出了很多优质的专栏文章,所涉及领域也正在慢慢完善.有很多小伙伴已经加入了我们,但是还满足不了我们的需求,期待更多的优秀作 ...

  4. c语言数组教案下载,C语言电子教案第七章指针与数组

    第1页 时 间 12 月 02 日 星期 2 课 题 指针与数组 教学目标 掌握指针和数组的定义以及使用方法 教学重点 指针数组的定义及使用 教学难点 指针数组的使用 课 型 公共课 教学媒体 多媒体 ...

  5. 用c语言输出数组中最小值,C语言.由键盘输入10个整数存入数组,输出最大值、最小值及它们的位置信息.并将最大、最小值位置互换后,再...

    共回答了18个问题采纳率:88.9% /* 输入10个整数(空格隔开) :45 67 71 23 19 87 62 33 91 24 67 71 23 19 87 62 33 91 24 最大值是 : ...

  6. oracle 序列赋值变量,Oracle变量的定义、赋值及使用

    首先,当在cmd里办入scott密码提示错误时,可以这样改一下,scott的解锁命令是: 以system用户登录: cmd sqlplus system/tigertiger alter user s ...

  7. c语言参数列表定义一个三维数组,C语言多维数组

    C语言多维数组教程 一般我们使用最多的就是二维数组,很少用到三维数组,更多维的数组几乎更用不到. C语言二维数组详解 定义 C 语言的二维数组,就是数组的每一个元素都是一个一维数组. 语法 type ...

  8. 循环队列–C语言实现–数据结构

    循环队列–C语言实现–数据结构 目录 循环队列C语言实现数据结构 目录 一 要求 二 循环队列 三 循环队列的算法设计 1 建立循环队列 2 置空队列 3 入队 4 出队 5 打印队 四 程序 1 程 ...

  9. linux shell 数组遍历,shell 数组 循环

    #!/bin/bash array=(1 2 3 4 5) #以括号括起为数组 中间是空格 for num in "${array[@]}" #以这种for打印数组 do echo ...

  10. java语言:创建一个二维数组,将古诗《春晓》的内容赋值于二维数组,然后分别用横版和竖版两种方式输出。

    问题:创建一个二维数组,将古诗<春晓>的内容赋值于二维数组,然后分别用横版和竖版两种方式输出. 前两天上java课的时候老师,给我们出了这道题.要求:要用java语言来写. 根据要求创建的 ...

最新文章

  1. 硬盘无法访问文件系统损坏,里面的资料怎样恢复
  2. 北大清华合力打造通用人工智能实验班
  3. MySQL下优化SQL的一般步骤
  4. 2019区块链行业指南
  5. 企业绩效管理系统之平衡记分卡
  6. 无监督学习与监督学习_有监督与无监督学习
  7. java基础面试题之:i++与++i的区别
  8. java输入一串字符串反转_反转Java中的字符串
  9. ★★★【加快】页面的【加载速度】,先减少图片请求★
  10. app界面设计规范及缺陷
  11. 关于正向级数收敛而它的平方也收敛的证明
  12. 【烈日炎炎战后端】MySQL编程(3.6万字)
  13. 高并发、高性能、高可用
  14. ENVI 5.1设置影像背景值透明显示
  15. 关于中国地图审图号的说明
  16. 新海诚画集[秒速5センチメートル:樱花抄·铁道]...
  17. java 行列式计算_n阶行列式的全排列求解(Java)
  18. 网络线缆连接器和线槽
  19. C语言dialog函数用法,DialogBox用法
  20. 元账户层是进入Web3元宇宙的传送门

热门文章

  1. 【PhotoScan精品教程】PhotoScan简介、安装教程(附PhotoScan1.4.5安装包下载)
  2. 12.2.1 QTcpSocket类介绍
  3. 多目标跟踪 | 评测指标
  4. 为什么你写了一万小时的代码,却没能成为架构师?| 程序员有话说
  5. STM32驱动TM1616程序加原理图
  6. 职称计算机xp上机考试内容,全国职称计算机考试WindowsXP中文操作系统模块最新上机操作试题(1-12套)...
  7. mysql获取字符串长度函数(CHAR_LENGTH)
  8. eclipse 工具翻译插件安装
  9. DDoS 攻击次数和流量峰值情况
  10. 为什么大龄程序员不能去创业?网友:看完这四个原因你就懂了