C/C++动态分配二维数组

本文介绍了在C和C++中如何动态分配二维数组,包括内存不连续和连续的分配方法。C中动态分配二维数组有多种方式,而在C++中则有更简洁的实现。

一:C中动态分配二维数组

(1)内存不连续的分配       

#include <stdio.h>
#include <malloc.h>

#define M 3 
#define N 3
 

// 这样在同一个数组内是连续分配的,但是实际上是不连续分配的

int main(int argc , char*argv[])
{
       int i ,j ;
      int **matric ;
  
      matric = (int**)malloc(M*sizeof(int*));
  
      for(i = 0 ; i<M ; i++)
         *(matric+i) = (int*)malloc(N*sizeof(int));
  
	for(i = 0 ; i<M ; i++)
	for(j=0 ; j<N ; j++)
	{
	printf("Please entry the %d value:\n",i*N+j);
	scanf("%d",(*(matric+i)+j));
	}
	for(i = 0 ; i<M ; i++)
	{
		  switch(i)
		  {
		  case 0 :
		  printf("第一行数组元素:\n");
		  break ; 
		  case 1:
		  printf("第二行数组元素:\n") ;
		  break ; 
		  case 2:
		  printf("第三行数组元素:\n") ; 
		  break;
		  }
		  
			for(j = 0 ; j<N ; j++)
			{  
			printf("The values of %d elements are:%d\n",i*N+j,*(*(matric+i)+j));
			printf("The pointer position is:%x\n",(*(matric+i)+j)) ; 
			}
      }


	  for(i = 0 ;i<M ; i++)
	  {
		  free(*(matric+i));
	  }
	  
		  free(matric) ;

   return 0 ;
 }
运行结果为:可以明确看出内存是不连续的。


(2)连续的方法:

	int **matric ; 
	matric = (int**)malloc(M*sizeof(int*)) ; 
    
	matric[0] = (int*)malloc(sizeof(int)*M*N) ; 

	for(i = 1 ; i<M ; i++)
	{
		matric[i] = matric[i-1] + N ;

	}

	for(i = 0 ; i<M ; i++)
		for(j=0 ; j<N ; j++)
		{
			printf("Please entry the %d value:\n",i*N+j);
			scanf("%d",(*(matric+i)+j));
		}
		for(i = 0 ; i<M ; i++)
		{
			switch(i)
			{
			case 0 :
				printf("第一行数组元素:\n");
				break ; 
			case 1:
				printf("第二行数组元素:\n") ;
				break ; 
			case 2:
				printf("第三行数组元素:\n") ; 
				break;
			}
			
			for(j = 0 ; j<N ; j++)
			{  
				printf("The values of %d elements are:%d\n",i*N+j,*(*(matric+i)+j));
				printf("The pointer position is:%x\n",(*(matric+i)+j)) ; 
			}
      }

运行结果为:可见,内存都是连续的。

二: C++版,这里不再贴代码了,只把最核心的东西贴出来看一下:

(1)内存不连续

char **a;
a = new char* [m];//分配指针数组
for(int i=0; i<m; i++)
{
a[i] = new char[n];//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;

(2)内存连续

char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空间
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
delete[] a[0];
delete[] a;
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值