二维数组的一些问题

原创 2007年09月23日 21:45:00

 先谈一下二维数组的动态创建和撤销,代码如下:

 


 

    //动态建立10*10的二维数组
    int **p=new int*[10];
    for(int i=0;i!=10;++i)
    {
        p[i]=new int[10];
    }
    for(int a=0;a!=10;++a)
    {
        for(int b=0;b!=10;++b)
        {
            p[a][b]=a*b;
        }
    }

    //释放内存
    for(int i=0;i!=10;++i)
    {
        delete []p[i];
    }
    delete []p;

 


 

  建立一个int*的数组,然后每个数组元素再去创建一个int数组,这样就建立了一个二维数组,其数组首地址是一个int**类型,这一点我们在创建的时候就看出来了。释放内存的时候就需要用一个循环来依次释放每个元素所指向的内存空间。

  好了,切入正题。

  我们现在要编写一个函数,这个函数接受一个二维数组的首地址作为参数,首先我们在桟上建立一个二维数组:

  int sz[10][10]={0};

然后我们将它作为参数传递给函数fun(),那么现在遇到了一个问题:fun的函数声明怎么写呢?
二维数组的首地址是一个指针,它指向了一个数组,这个数组的每个元素又是一个数组,那么我们接受一个int**类型可不可以呢?

void fun(int **p);

我们发现无法通过编译,原因是类型不匹配:

cannot convert `int (*)[10]' to `int**' for argument `1' to `void fun(int**)'

编译器提示我们这个二维数组的首地址是个 int (*)[10] 类型,问题就出在这,非动态创建的二维数组的首地址的类型其实是一个行指针,改写一下fun:

void fun(int (*p)[10]);

我们写一个完整的程序:

 


 

#include <iostream>
#include <iomanip>
using namespace std;

void fun(int (*p)[10])
{
    for(int a=0;a!=10;++a)
    {
        for(int b=0;b!=10;++b)
        {
            cout<<setw(4)<<setfill(' ')<<p[a][b]<<" ";
        }
        cout<<endl;
    }
}

int main()
{
    int sz[10][10];
    for(int a=0;a!=10;++a)
    {
        for(int b=0;b!=10;++b)
        {
            sz[a][b]=a*b;
        }
    }
    fun(sz);
    system("pause");
}

 


 

  对于动态创建的二维数组,参数的类型就要看该数组创建时所用的指针类型,对于本文一开始所用的方法,fun函数就要接受一个int**类型的指针:

void fun(int **p);

  解决了这一问题之后,接下来还有一个问题,如果我们要返回一个二维数组的指针呢?
对于动态创建的来说,fun只需要声明返回一个int**就行了,但是对于桟上声明的数组来说fun函数的声明比较繁琐,这里给出两种解决方法:

//1.用typedef做一个类型名字的变换
typedef int(*LPSZ_T)[10];
LPSZ_T fun(LPSZ_T p);

//2.直接写类型,比较不容易
int (*fun(int (*p)[10]))[10];

在这里推荐第一种写法,但是第二种也要了解,分析一下:

int (*     fun(int (*p)[10])     )[10];

中间的表示函数名和参数表,左边的'*'表示返回一个指针,这个指针指向了一个包含10个int元素的数组。 

一维指针和二维指针指向二维数组的一些问题

废话少说,先上自己Dev c++上的代码: #includeint main (){ int c[2][3]={15,2,3,4,5,6}, *p, (*rp)[3],*q,i; ...

N皇后问题(二维数组)

  • 2012年08月11日 17:48
  • 2KB
  • 下载

二维数组作为函数参数问题

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:     void Func(int array[3][10]); ...

关于如何初始化一个类内的静态二维数组变量问题

用面向对象写了一个黑白棋的代码, 发现不知道如何去初始化一个静态的二维数组, 编译器总是报错。先给大家看看类内的一些声明吧 class chess { public: chess(int a...

二维数组和二级指针的传递问题

转自:http://www.wutianqi.com/?p=1822 再次看这篇文章,感觉说的好多都是废话,在文章最前面补充一句话: “[]的优先级高于*”,大家可以带着这句话看下面的~~...

一个疑惑,为什么在二维数组里可以自动换行存入字符串,以及冒泡的趟数问题?

#include #include #include #include #include #undef EOF #define EOF -1 #define N 20 /* 函数fun,该函...

js 二维数组排序问题

我们知道在js中默认提供了sort函数,但是这个函数默认是按照数组内容的ascii码升序进行排列的,如果我们要对二维数组排序要如何做呢?在php中是有multi_sort函数可供调用的,但是在js中似...
  • wyodyia
  • wyodyia
  • 2012年03月23日 11:24
  • 7180

关于dp01背包问题的几点理解(二维数组,java实现)

01背包问题: 给定N种物品和一个背包。物品i的重量是weight[i],其价值value[i] (i...

二维数组传参问题

先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致。 char str_arr[3][10] = {"yes","no","uncertain"}; char ...

初学php 二维数组相关问题

今天想将sqlite3数据库里面的文章导出成静态的html文件----每个html文件是一篇文章,并且能够链接 上一篇 和 下一篇、总目录。 SQ:是一些古典名著。 期望的最终效果是: index.h...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二维数组的一些问题
举报原因:
原因补充:

(最多只允许输入30个字)