博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二维动态数组定义及二维静态数组与**P的区别
阅读量:5164 次
发布时间:2019-06-13

本文共 2601 字,大约阅读时间需要 8 分钟。

矩力集成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和静态二维数组的本质区别!

转载于:https://www.cnblogs.com/xmphoenix/archive/2011/11/21/2257712.html

你可能感兴趣的文章
JavaScript学习笔记——语法基础1.1
查看>>
我回答了90%的面试题,为什么还被拒?
查看>>
Html - Table 表头固定和 tbody 设置 height 在IE不起作用的解决
查看>>
20165205 学习基础与C语言基础调查
查看>>
iOS SVN终端指令
查看>>
SpringSecurity——默认过滤器链
查看>>
LeetCode: Word Ladder II [127]
查看>>
Linux如何更新软件源
查看>>
SQL使用CASE 语句
查看>>
day8 (异常处理和网络编程)
查看>>
php中函数 vsprintf() 和 var_export()
查看>>
多线程(1)—单线程
查看>>
HTML5权威指南 16.拖放API与通知API
查看>>
NYOJ-289 苹果 又是一个典型的01背包和上题一样没啥好说的
查看>>
HDU 2262 回溯算法 递归枚举
查看>>
九度0J 1374 所有员工年龄排序
查看>>
listview初始化后仍为空
查看>>
无刷新分页
查看>>
SIFT算法
查看>>
git各种撤销操作
查看>>