二维动态数组定义及二维静态数组与**P的区别
矩力集成2008年校园招聘笔试题:动态申请一个二维数组存储图像阵列
传统的解决方案是分配一个指针数组, 然后把每个指针初始化为动态分配的 ``列"。 以下为一个二维的例子:
//typedef int (*arraypoiter)[ncolumns];
int **dynamic_alloc_arrays(unsigned int nrows,unsigned int ncolumns)
{
unsigned int i;
int **array = (int **)malloc(nrows * sizeof(int *));
for(i = 0; i < nrows; i++)
array[i] = (int *)malloc(ncolumns * sizeof(int));
printf("array=0x%x/n",(int)array);
for(i=0;i<nrows;i++)
{
printf("array[%d]=0x%x/n",i,(int)array[i]);
}
printf("/n");
return array;
}
void main(void)
{
int **test_allocate;
unsigned int nrows=3;
unsigned int ncolumns=4;
test_allocate = dynamic_alloc_arrays(nrows,ncolumns);
printf("test_allocate=%x/n",test_allocate);
}
/*
array=911c70
array[0]=911c30
array[1]=911bf0
array[2]=911bb0
test_allocate=911c70
*/
当然, 在真实代码中, 所有的 malloc 返回值都必须检查。你也可以使用 sizeof(*array) 和sizeof(**array) 代替 sizeof(int *) 和 sizeof(int)(因为*array的类型为int *,**array的类型为int)。
你可以让数组的内存连续, 但在后来重新分配列的时候会比较困难, 得使用一点指针算术:
int **dynamic_alloc_arrays(unsigned int nrows,unsigned int ncolumns)
{
unsigned int i;
int **array = (int **)malloc(nrows * sizeof(int *));
array[0] = (int *)malloc(nrows * ncolumns * sizeof(int));
for(i = 1; i < nrows; i++)
array[i] = array[0] + i * ncolumns;
printf("array=0x%x/n",(int)array);
for(i=0;i<nrows;i++)
{
printf("array[%d]=0x%x/n",i,(int)array[i]);
}
printf("/n");
return array;
}
void main(void)
{
int **test_allocate;
unsigned int nrows=3;
unsigned int ncolumns=4;
test_allocate = dynamic_alloc_arrays(nrows,ncolumns);
printf("test_allocate=%x/n",test_allocate);
}
/*
array=911c70
array[0]=911c10
array[1]=911c20
array[2]=911c30
test_allocate=911c70
*/
在两种情况下, 动态数组的成员都可以用正常的数组下标 arrayx[i][j] 来访问 (for 0 <= i <nrows 和 0 <= j <ncolumns)。
另一种选择是使用数组指针:
int (*array4)[NCOLUMNS] = malloc(nrows * sizeof(*array4));
但是这个语法变得可怕而且运行时最多只能确定一维。因为NCOLUMNS必须为定值
××××××××××××××××××××××××××××××××××××××
C语言里,数组名是被看作指针来使用的,一维数组是指针,二维数组是指向指针的指针,三维是......... 真的是这样的吗??看下面的例子:
void show (int * * info, int x, int y) //打印一个x*y的数组的内容
{
int i, j;
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf ("%d ",info[i][j]);
}
printf ("/n");
}
}
void Function (void)
{
int as[10][10];
show (as,10,10);
// error C2664: 'show' : cannot convert parameter 1 from 'int [10][10]' to 'int ** ' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
}
在C中没有安全类型检查,上述程序只是warning,但是程序运行会崩溃
在C++中,根本就无法编译通过,即as[10][10]和int * *根本不是一个类型
为什么?在c中,二维数组虽然是定义为指向指针的指针,但是实际上被指向的指针是不存在的,即没有一个内存来存储这个指针,只是在执行as [n]时返回一个指针罢了,as所指的不过是存放数组内容的地址!!
实际上从上面**P和动态二维数组的使用即可看出来,**P和静态二维数组的本质区别!
二维动态数组定义及二维静态数组与**P的区别相关推荐
- VBA 数组定义,赋值,一维数组
1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element ...
- C语言 二维数组定义和使用 - C语言零基础入门教程
目录 一.二维数组简介 二.定义二维数组并初始化 1.定义二维数组 2.初始化二维数组 三.访问二维数组 四.修改二维数组 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 & ...
- oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化
定义: int *pia = new int[10]; //array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该 ...
- 返回一个二维整数数组中的最大的子数组和
一.题目: 1.输入一个二维整形数组,数组里有正数有负数. 2.二维数组中连续的一个子矩阵组成一个子数组. 3.求所有子数组的和的最大值. 二.设计思想: .定义一个二维数组,使用二重循环对其进行赋值 ...
- vba二维数组初始化_VBA二维数组的基础介绍
既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了.下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率.Sub Exchange() Dim t As S ...
- python 多维数组去重_python多维数组运算-女性时尚流行美容健康娱乐mv-ida网
自动秒收录 如何加入 (当前页) 购买本站源码 自媒体交流 查询是否收录 查询收录 × 快速加入 只要做上本站的友情链接,并在您站上点击一次,就免人工自动收录!并自动排在本站第一位. 本站已收录286 ...
- (三)Java的基本程序结构(二)---数据输入、控制流、大数、数组
Java的基本程序结构(二)-数据输入.控制流.大数.数组 文章目录 Java的基本程序结构(二)---数据输入.控制流.大数.数组 前言 一.数据输入 二.控制流 1.块作用域 2.流程控制语句分类 ...
- Java04-day04【IDEA(概述、启动配置、项目结构、内容辅助键、快捷键、模块操作)、数组(定义详解、动态初始化、访问)、内存分配、数组内存图】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] &qu ...
- java数组的声明_Java数组定义常用方法
Java数组定义常用方法 Java中的数组.是一种简单的线性数据存储结构.他用牺牲自动扩展大小来换取与集合相比的唯一优势--查询效率的提升.Java中的数组有什么类型?我们要怎么定义这些数组呢?下面跟 ...
最新文章
- 做程序员10年了,复制粘贴是我最牛逼的技能,从菜鸟兑变成大牛,直到看了这些大佬的公众号...
- HBase参数配置及说明
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...
- html轮廓位置,html – 具有边框/轮廓的六边形
- Android Navigation Drawer(导航抽屉)
- 习题3-11 Kickdown UVA - 1588
- nstimer循环引用_ios开发中经典循环引用场景?
- SQL 中的unicode字符
- Java中interrupted()和isInterrupted()之间的区别
- 远程光电容积脉搏波描记法(rPPG)
- 【01】blockqote美化
- 强化学习组队学习task02——马尔可夫决策过程及表格型方法
- DataTable 去重合并
- 区块链游戏《TmoLand明日世界》又叒叕更新了
- 2100 没有反弹shell_反弹shell | ncbash
- java ffmpeg amr转wav_FFmpeg转音频格式为wav
- 【0】嵌入式TCP/IP协议——————Art-Net协议详解
- CKA 认证笔记 - CKA 认证经验帖
- 手刃豆瓣top250排行榜
- 火车票分批放票大概时间