动态开辟二维数组的两种方案及位体

  • 一、在静态二维数组中查询数据
  • 二、动态开辟二维数组空间
    • 1.用二级指针的方式开辟
    • 2.用结构体的方式开辟
  • 三、位体

先来回顾一下动态开辟一位数组的方法:

#include<stdio.h>
#include<stdlib.h>
int main()
{int n = 0;int* ip = nullptr;scanf_s("%d", &n);ip = (int*)malloc(sizeof(int) * n);if (nullptr == ip)exit(1);for (int i = 0; i < n; ++i){ip[i] = i;}free(ip);    //结束后要记得释放内存;ip = nullptr;//将指针置空,防止出现野指针;return 0;
}

一、在静态二维数组中查询数据

  • 使用范围:二维数组中上一行最后一个数据小于下一行第一个数据。即a<b,c<d的情况。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>int FindValue(int(*br)[4], int row, int col, int val)  //本质上讲是二分查找;
{assert(br != nullptr);int pos = -1;int* p = (int* )br;int left = 0, right = row * col - 1;while (left <= right){int mid = (right - left) / 2 + left;if (val < p[mid]){right = mid - 1;}else if (val > p[mid]){left = mid + 1;}else{pos = mid;break;}}return pos;
}int main()
{int ar[3][4] = { 12,23,34,45,56,67,78,89,90,100,110,120 };int val[] = { 23,100,34,8,80,130 };    //测试的数据;for (int i = 0; i < sizeof(val) / sizeof(val[0]); i++){int pos = FindValue(ar, 3, 4, val[i]);if (pos != -1){printf("row=%d col=%d\n", pos / 4, pos % 4);  //打印所测数据的行和列;}else{printf("find not\n");}}return 0;
}

运行结果:

因为静态二维数组在内存中是连续存放的,所以可以用二分查找。

二、动态开辟二维数组空间

1.用二级指针的方式开辟

方法:先申请连续的指针类型的空间,指针再申请空间。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{int** br = nullptr;      //申请一个二级指针;int row = 0, col = 0;scanf_s("%d %d", &row, &col);br = (int**)malloc(sizeof(int*) * row);  //用二级指针动态申请空间,用来存放一级指针;if (nullptr == br) exit(1);for (int i = 0; i < row; i++)            //动态为连续的一级指针申请空间;{br[i] = (int*)malloc(sizeof(int) * col);//申请到的空间存放整型数据;if (nullptr == br[i]) exit(1);}for (int i = 0; i < row; i++)         //初始化所申请的空间;{for (int j = 0; j < col; j++){br[i][j] = i + j;}}for (int i = 0; i < row; i++)        //打印二维数组;{for (int j = 0; j < col; j++){printf("%5d", br[i][j]);}printf("\n");}printf("\n");for (int i = 0; i < row; i++)   //释放动态申请的空间;{free(br[i]);br[i] = nullptr;}free(br);br = nullptr;return 0;
}

运行结果:

注意:此种方式申请空间时访问数据的形式和静态方式申请访问数据形式有本质区别:

2.用结构体的方式开辟

和顺序表的方法类似,开辟出来的空间是连续的。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct BinArray
{int* data;   //用来开辟动态内存的指针;int row;int col;
};void Init_BinArray(struct BinArray* bp, int r, int c)//初始化函数
{assert(bp != nullptr);bp->row = r;bp->col = c;bp->data = (int*)malloc(sizeof(int) * c * r);//确定开辟空间的大小;if (bp->data == nullptr)exit(1);
}void SetValue(struct BinArray* bp, int r, int c , int val)   //赋值函数
{assert(bp != nullptr && r <= bp->row && c <= bp->col);bp->data[r * bp->col + c] = val;    //模拟二维数组赋值形式;
}int GetValue(struct BinArray* bp, int r, int c)   //获取数据函数
{assert(bp != nullptr && r <= bp->row && c <= bp->col);return bp->data[r * bp->col + c];    //模拟二维数组获取数据形式;
}void DestroyBinArray(struct BinArray* bp)    //销毁函数;
{assert(bp != nullptr);free(bp->data);bp->data = nullptr;bp->col = -1;bp->row = -1;
}int main()
{BinArray br;int r, c;scanf_s("%d %d", &r, &c);//输入想要的行数和列数;Init_BinArray(&br, r, c);for (int i = 0; i < r; i++)   //给二维数组赋值;{for (int j = 0; j < c; j++){SetValue(&br, i, j, i + j);}}for (int i = 0; i < r; i++){for (int j = 0; j < c; j++){printf("%5d", GetValue(&br,i,j));}printf("\n");}printf("\n");DestroyBinArray(&br);return 0;
}

运行结果:

三、位体

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>struct Node
{char tag : 4;//char :0;    //告诉编译器,tag和sev不在同一个字节中,存储时,sev会重新存入一个字节;unsigned char sev : 3;char tall : 5;
};int main()
{struct Node x = {};x.tag = 8;x.sev = 7;x.tall=-8;return 0;
}


当第一个字节存储位不够存储tall时,tall会另存一个字节,并且也是按照4个比特位读取,-8在内存中会显示01 80;

动态开辟二维数组的两种方案及位体相关推荐

  1. C++ 动态开辟二维数组的的方法

    近日写到一个程序,用到了要动态开辟二维数组,一想,自己就会两种.一者:用new在堆上开辟:二者:用vector开辟.技巧没有多少,但是确实是折腾了我半天!首先,大家去网上搜一下,动态开辟二维数组的文章 ...

  2. 用new创建一个二维数组,有两种方法,是等价的

    //用new创建一个二维数组,有两种方法,是等价的      一:      int   (*p)[10]   =   new   int[5][10];      二:      int   **p ...

  3. [ 1001] 动态开辟二维数组的说明

    开辟二维数组的说明 图解  [1][][][][] [2][][][][] [3][][][][] void main() { int i,j; /*注意申请的指针格式  先创建的是1,2,3首地址为 ...

  4. 用malloc开辟二维数组的三种办法

    第一种办法:用指针数组:首先看一下原理图(以开辟整型二维数组三行四列为例,以下都是): 先看一下用malloc申请一维数组: int *p=(int *)malloc(10*sizeof(int)); ...

  5. php 去除二维数组重复,两种php去除二维数组的重复项方法_PHP

    php去掉二维数组的重复值的方法总结,具体代码如下: 方法一: //二维数组去掉重复值 function array_unique_fb($array2D){ foreach ($array2D as ...

  6. c语言动态生成二维数组,C语言 动态创建二维数组

    /*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include #include #include #define RANK 10 #define COLUMN ...

  7. 用malloc动态申请一个二维数组的三种方法

    方法一:利用二级指针申请一个二维数组. #include<stdio.h> #include<stdlib.h> int main() { int **a; //用二级指针动态 ...

  8. C++ 动态创建二维数组

    背景知识: 对二维数组的理解方式至关重要:把二维数组看成是一种特殊的一维数组,它的元素又是一个一维数组. 例如:int a[3][4], 可以理解为定义了3个一维数组,即相当于  a[0], a[1] ...

  9. C语言-动态创建二维数组

    文章目录 1 前言 2 动态创建的实现方法 2.1 方法1(适用于二级指针传递) 2.2 方法2(模拟C语言数组的储存方式) 1 前言 参照我之前的一篇文章 二维数组做函数的参数 文章中提到,当我们想 ...

最新文章

  1. ImportError: No localization support for language ‘eng’ in python
  2. 从IEEE754标准谈C语言浮点数据类型
  3. 堆排序\链表实现局部排序
  4. 分子生物学-共价键基础
  5. Spark SQL使用window进行统计
  6. vue 数组转集合_思想实验:如何在Vue中使localStorage具有响应式?
  7. Unix/Linux 中的 shell 机制
  8. ad16不能去除铺铜_海水小讲堂006 铜离子的正确使用姿势
  9. [Angular 2] ngFor
  10. [swift 进阶]读书笔记-第一章:介绍、第二章(C2P2):第二章:内建集合类型
  11. 2020-10-01
  12. 题目1003:A+B 使用大数相加方法解法
  13. java web个人博客开发(一需求获取和需求分析文档)
  14. 人工智能面试问题整理
  15. python安卓手机编程入门自学_编程入门学习路线(附教程推荐)
  16. 霍尔编码器和电机驱动L298N
  17. js中继承的几种方式
  18. 2022苹果开发者账号续费问题
  19. windows搭建nginx + php环境
  20. 洛谷 P2186 小Z的栈函数

热门文章

  1. Ubuntu创建新用户的正确姿势
  2. .Net转Java自学之路—基础巩固篇一
  3. C++ 对引用的深入理解
  4. Bootstrap 4 正式发布,却可能生不逢时
  5. raid5数据恢复成功案例
  6. 用python写通用restful api service(一)
  7. Codeforces 847C - Sum of Nestings
  8. Oracle触发器修改数据时同步执行插入该条数据
  9. hdu 5273 Dylans loves sequence 逆序数简单递推
  10. VRRP和单臂路由的综合运用