一: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;
本文介绍了在C和C++中如何动态分配二维数组,包括内存不连续和连续的分配方法。C中动态分配二维数组有多种方式,而在C++中则有更简洁的实现。

9692

被折叠的 条评论
为什么被折叠?



