动态分配二维数组空间,常用的方法是:
先开辟一个指向指针的指针 p ,将其指向指针数组 ; 然后将指针数组中每一个指针指向一维存储空间 。
下面以分别以new和malloc来举例说明:
Sample 1:用new 开辟一个 形如 int a[3][4] 的存储空间:
#include <iostream>
using namespace std;
int main()
{
//开辟空间
int **p;
p=new int*[3];
int i,j;
for(i=0;i<3;i++)
p[i]=new int[4];
//对其赋值
for(i=0;i<3;i++)
for(j=0;j<4;j++)
p[i][j]=1;
//输出
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
cout<<p[i][j]<<" ";
cout<<endl;
}
return 0;
}
Sample 2:用malloc 开辟同样的空间,不同之处是
1、#include <stdlib.h>
2、malloc需要强制类型转换(原因请自行搜索 malloc 用法)
同样以形如 int a[3][4] 为例
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
//开辟空间
int **p;
p=(int **)malloc(3*sizeof(int *));
int i,j;
for(i=0;i<3;i++)
p[i]=(int *)malloc(4*sizeof(int));
//对其赋值
for(i=0;i<3;i++)
for(j=0;j<4;j++)
p[i][j]=1;
//输出
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
cout<<p[i][j]<<" ";
cout<<endl;
}
return 0;
}
Sample 3:char 类型二维数组 空间开辟
char 类型二维数组 开辟方法与 int 一样:
以 char a[3][4] 为例:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
//开辟空间
char **p;
p=(char **)malloc(3*sizeof(char *));
int i,j;
for(i=0;i<3;i++)
p[i]=(char *)malloc(4*sizeof(char));
//对其赋值
for(i=0;i<3;i++)
for(j=0;j<4;j++)
p[i][j]='1';
//输出
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
cout<<p[i][j]<<" ";
cout<<endl;
}
return 0;
}
Smaple 4:char a[3][4] 另一种开辟的方法:
《剑指offer》中看到另一种方法:
//开辟空间
char **p;
p=(char **)(new int[3]);
for(int i=0;i<3;i++)
p[i]=new char[4];
其中 p=(char **)(new int [3])的效果与 p=new char *[3] 效果一样,
只不过先开辟了一个指向一维数组的指针(new int[3] ,假定为 s),如下:
其次,进行强制类型转换,将 s 强制转换为 ( char **) 类型 p