矩力集成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的区别相关推荐

  1. VBA 数组定义,赋值,一维数组

    1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element ...

  2. C语言 二维数组定义和使用 - C语言零基础入门教程

    目录 一.二维数组简介 二.定义二维数组并初始化 1.定义二维数组 2.初始化二维数组 三.访问二维数组 四.修改二维数组 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 & ...

  3. oracle 声明二维数组,[zt]C++二维数组讲解、二维数组的声明和初始化

    定义: int *pia = new int[10]; //array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该 ...

  4. 返回一个二维整数数组中的最大的子数组和

    一.题目: 1.输入一个二维整形数组,数组里有正数有负数. 2.二维数组中连续的一个子矩阵组成一个子数组. 3.求所有子数组的和的最大值. 二.设计思想: .定义一个二维数组,使用二重循环对其进行赋值 ...

  5. vba二维数组初始化_VBA二维数组的基础介绍

    既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了.下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率.Sub Exchange() Dim t As S ...

  6. python 多维数组去重_python多维数组运算-女性时尚流行美容健康娱乐mv-ida网

    自动秒收录 如何加入 (当前页) 购买本站源码 自媒体交流 查询是否收录 查询收录 × 快速加入 只要做上本站的友情链接,并在您站上点击一次,就免人工自动收录!并自动排在本站第一位. 本站已收录286 ...

  7. (三)Java的基本程序结构(二)---数据输入、控制流、大数、数组

    Java的基本程序结构(二)-数据输入.控制流.大数.数组 文章目录 Java的基本程序结构(二)---数据输入.控制流.大数.数组 前言 一.数据输入 二.控制流 1.块作用域 2.流程控制语句分类 ...

  8. Java04-day04【IDEA(概述、启动配置、项目结构、内容辅助键、快捷键、模块操作)、数组(定义详解、动态初始化、访问)、内存分配、数组内存图】

    java零基础入门到精通(2019版)[黑马程序员] 视频+资料:[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] &qu ...

  9. java数组的声明_Java数组定义常用方法

    Java数组定义常用方法 Java中的数组.是一种简单的线性数据存储结构.他用牺牲自动扩展大小来换取与集合相比的唯一优势--查询效率的提升.Java中的数组有什么类型?我们要怎么定义这些数组呢?下面跟 ...

最新文章

  1. 做程序员10年了,复制粘贴是我最牛逼的技能,从菜鸟兑变成大牛,直到看了这些大佬的公众号...
  2. HBase参数配置及说明
  3. Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...
  4. html轮廓位置,html – 具有边框/轮廓的六边形
  5. Android Navigation Drawer(导航抽屉)
  6. 习题3-11 Kickdown UVA - 1588
  7. nstimer循环引用_ios开发中经典循环引用场景?
  8. SQL 中的unicode字符
  9. Java中interrupted()和isInterrupted()之间的区别
  10. 远程光电容积脉搏波描记法(rPPG)
  11. 【01】blockqote美化
  12. 强化学习组队学习task02——马尔可夫决策过程及表格型方法
  13. DataTable 去重合并
  14. 区块链游戏《TmoLand明日世界》又叒叕更新了
  15. 2100 没有反弹shell_反弹shell | ncbash
  16. java ffmpeg amr转wav_FFmpeg转音频格式为wav
  17. 【0】嵌入式TCP/IP协议——————Art-Net协议详解
  18. CKA 认证笔记 - CKA 认证经验帖
  19. 手刃豆瓣top250排行榜
  20. 火车票分批放票大概时间

热门文章

  1. 投资,个人未来的生存之道(任何个人必知)
  2. ubuntu docker报错
  3. Can not issue data manipulation statements with executeQuery()错误解决
  4. 墨者_rsync未授权访问漏洞
  5. 12306春节高速抢票
  6. Java高并发系列 — AQS
  7. python学习之函数
  8. JAVA中的线程安全与非线程安全
  9. 【Spring-AOP-1】AOP相关概念
  10. C#如何操作另一个窗体:[2]子窗体操作主窗体(转)