二维数组的动态使用(记录)(附上一段自己的代码)


|字号 订阅

常规的方法当然就是a[][]方式,这里主要介绍另外两种方法: 

方法一:              
 const int ROW = 3;
 int  size = 5;
 int  (*pi)[ROW] = new int[size][ROW];//注意不要写成int (pi*)[ROW]

操作方法:
 for ( i=0; i<ROW; ++i )
 {
  for ( int j=0; j<size; ++j )
  {
   pi[i][j] = k++;//初始化
   cout <<setw(2) <<pi[i][j] <<' ';//输出
  }
  cout <<endl;
 }

内存释放:

           delete[] pi;
           pi=NULL;
缺点:ROW必须是已知。
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)。


方法二:

    使用指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组: 
    定义:
           int **b=new int*[row];     //分配一个指针数组,将其首地址保存在b中                                                     
           for(i=0;i<row;i++)           //为指针数组的每个元素分配一个数组
               b[i]=new int[col];


操作方法:
 for ( i=0; i<row; ++i )
 {
  for ( int j=0; j<col; ++j )
  {
   b[i][j] = k++;//初始化
   cout <<setw(2) <<b[i][j] <<' ';//输出
  }
  cout <<endl;
 }

内存释放:
           for(i=0;i<row;i++)
           {
                 delete [col]  b[i];
                 b[i]=NULL;
           }
           delete [row]  b;
           b=NULL;

缺点:非连续储存,内存释放烦琐,双重指针。
优点:调用直观, row,col可以不是已知。

           该方法定义的动态二维数组的释放需先释放指针数组每个元素指向的数组,然后再释放该指针数组。


    方法三:

    同样是使用指针数组,然后使每一个指针元素指向一个数组,与方法二类似,写法不同:

    int *matrix[5];  
    for(int i=0;i<5;i++)
    {
        matrix[i]=new int[5];
        for(int j=0;j<5;j++)
        {
            matrix[i][j]=i+j;
            cout<<matrix[i][j]<<" ";
        }
        cout<<endl;
    }

    内存释放:
    for(int i=0;i<5;i++)
         delete[] matrix[i];
    cout<<endl;

注:

 数组指针:int *a[5]它是一个含有5个整形指针元素的数组,它含有5个指针;

                   int (*a)[5]则表示它是一个指向含有5个元素的数组的指针,即它一个指针,如果是二维数组,则它必须含有5列;三维的则需要后两维也相同,如:int (*matri)[5][6]=new int[4][5][6]; 后面的两维必须相同。


我自己的代码,学习中。。。

	int strLen = strlen(itemText)+1;
	char tmpBuf[24];
	memset(tmpBuf,0,24);
	memcpy(tmpBuf,itemText,strLen);

	int offset = 0 ;
	char (*tmpChr)[6] = new char[24][6];
	int j = 0 ;

	for (int i = 0; i < strLen ; i++)
	{
		if (tmpBuf[i] == '-' || tmpBuf[i] == ' ' || tmpBuf[i] == ':' || tmpBuf[i] == '\0')
		{
			memset(tmpChr[j],0,24);
			memcpy(tmpChr[j],tmpBuf+offset,i-offset);
			offset = i+1;
			j++;
		}
	}

	req->StartTime.year = atoi(tmpChr[0]);
	req->StartTime.month = atoi(tmpChr[1]);
	req->StartTime.day = atoi(tmpChr[2]);
	req->StartTime.hour = atoi(tmpChr[3]);
	req->StartTime.minute = atoi(tmpChr[4]);
	req->StartTime.sec = atoi(tmpChr[5]);

	if (tmpChr)
	{
		delete []tmpChr;
		tmpChr= NULL;
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值