原创 C++中为数组动态分配内存(飞若网)

2010-9-9 10:01 1949 5 5 分类: 软件与OS

在C++中为数组动态分配内存的格式如下:
 
第一步:声明
       type (p)[常量1][常量2]...[常量n];
第二步:申请
       p=new type[x][常量1][常量2]...[常量n];
说明:先定义一个n维的数组指针,其中p是一个指针变量,x是一个整形变量,
      然后申请一个第一维为x的n+1维数组,记住只有第一维x可变。
举例:
   1、动态申请一个一维数组
      int *p;
      int x;
      cin>>x;
      p=new int[x];  
   2、动态申请一个二维整型数组
      int (*p)[10];
      int x;
      cin>>x;
      p=new int[x][10];
      若执行这段程序,给x输入3,则相当于定义一个3行10列的
      一个二维数组。实际是申请3102个存储单元,并把其首
      地址返回给p,通过p来操纵这个动态数组。
   3、动态申请一个三维数组
      int (*p)[8][6];
      int x;
      cin>>x;
      p=new int[x][8][6];
      
注意:
   1、申请成功与否,看p的值,若p的值为NULL,则说明申请不成功,
      反之,则申请成功。
   2、动态申请的存储单元,使用之后应及时返还给系统,方法是:
      delete p;即可。
///---------------------------------------------------------------->
malloc函数只能申请长度为size的连续空间,也就是说,它只能申请一维数组,但是你可以用一维数组代替二维数组来操作.
也可以用calloc函数来申请n个长度为size的连续空间,也就是说它也是只能申请一维数组,但它申请的格式很像二维数组.可以当作二维数组来操作.
如:
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
void main()
{
    char *a;
    int x,i,j;
    cin>>x;
    a=(char *)calloc(x,2*sizeof(char));
    for(i=0;i<x;i++)
        for(j=0;j<2;j++)
        {
            scanf("%c",&a[2*i+j]);
        }
    for(i=0;i<x;i++)
    {
        for(j=0;j<2;j++)
        {
        printf("%c ",a[2*i+j]);
        }
        }
}
///------------------------------------------------------------>
对于a=new char[x][2]; ,C中与之相对应的动态分配方法基本相同,例如:
char (*a)[2];
a = (char(*)[2])malloc(x*2*sizeof(char));
由于第二维被定死,还没有完全达到“动态”,还可以这样做:
char **p;
int i, iRow, iColumn;
.....
p = (char**)malloc(iRow*sizeof(char*));
for(i=0; i<iRow; ++i) p = (char*)malloc(iColumn*sizeof(char));
p[1][0] = ''A'';
.......
上面这个做法适合于整个数组尚未创建的情况,如果数据已经存在,又想改变维数,例如从一维改为二维来读取,可以这样做:
char a[100], **p;   /*把a改为当作二维读取*/
int i, iRow, iColumn;
p = (char**)malloc(iRow*sizeof(char*));
for(i=0; i<iRow; ++i) p = a+i*iColumn*sizeof(char);
上面的做法还可以扩展到三维、四维甚至维数也未定的情况。
void main()
{
   char **p;
int i, iRow=2, iColumn=2;
p = (char**)malloc(iRow*sizeof(char*));
for(i=0; i<iRow; ++i) p = (char*)malloc(iColumn*sizeof(char));
p[1][0] = ''A'';
cout<<p[1][0]<<endl;//A
}
//怎么释放二维数组内存delete []p;还是free(p)

for(int i=0;i<iColumn;i++)
delete p;
delete []p;
/*
void main()
{
    int n;
    cin>>n;
    char **str=new char*[n];
    for(int i=0;i<n;i++)
         str = new char[3];


   
    for(int j=0;j<n;j++)
  for(int m=0;m<3;m++){
   cin>>str[j][m];
    cout<<str[j][m]<<" ";
    cout<<endl; }
    for(int k=0;k<3;k++)
    delete str[k];
    delete []str;
}
*/
/*
void main()
{
    int i;
         char *str[5];
    for(i=0;i<5;i++)
    {
        printf("请输入第%d个学生的编号:\n",i+1);
        str=(char *)malloc(2*sizeof(char));
        scanf("%s",str);
                  //实现scanf("%s",str+i);
    }
    for(i=0;i<5;i++)
 cout<<str<<endl;
}
*/
//申请2维双精度实数数组
double **alloc_2d_dbl(int m, int n)
{
              int i;
              double **new1;
 
              new1 = new double*[m];
              if (new1 == NULL)
              {
                     printf("ALLOC_2D_DBL: Couldn''t allocate array of dbl ptrs\n");
                     return (NULL);
              }
 
              for (i = 0; i < m; i++)
              {
                     new1 = new double[n];
                     if (new1 == NULL)
                     {
                            printf("ALLOC_1D_DBL: Couldn''t allocate array of doubles\n");
                            return (NULL);
                    }
              }
              return (new1);
}
*/
//申请2维双精度实数数组
//这段代码与上面的不同在于实际上只是申请了一块一维的动态数组,然后将其转化为二维引用(因为我的目的就是要引用二位动态数组)。
double **alloc_2d_dbl(int m, int n)
{
              int i;
              double *new1;
              double **pnew1;
 
              pnew1 = new double*[m];
              new1 = new double[m*n];
 
              if (new1 == NULL)
              {
                     printf("ALLOC_2D_DBL: Couldn''t allocate array of dbl ptrs\n");
                     return (NULL);
              }
 
              for (i = 0; i < m; i++)
              {
                     pnew1 = &new1[n*i];
              }
              return (pnew1);
}


http://dev.firnow.com/

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条