相对来说,创建二维动态数组比一维动态数组更复杂些,可以分别在以下三种情况下创建二维动态数组:已知一维、已知二维、或两者都未知:
#include <stdio.h>#include <stdlib.h>const int rows=3;const int Cols=4;void arr2D(int** arr,int rows,int cols){int i,j;for(i=0;i<rows;i++) // 赋值for(j=0;j<cols;j++)arr[i][j]=i*cols+j+1;for(i=0;i<rows;i++) // 输出for(j=0;j<cols;j++)printf("%4d",arr[i][j]);printf("\n");}int main(){int i,j;// 1 利用指针数组生成一个rows*cols得动态二维数组,但第壹维rows是固定得一个常量int* p[rows]; // const int rows=3;int cols;printf("请输入二维数组得列数(默认%d行):",rows);scanf("%d",&cols);for(i=0;i<rows;i++){p[i]=(int*)malloc(sizeof(int)*cols);if(p[i]==NULL)exit(1);}for(i=0;i<rows;i++) // 赋值for(j=0;j<cols;j++)p[i][j]=i*cols+j+1;for(i=0;i<rows;i++) // 输出for(j=0;j<cols;j++)printf("%4d",p[i][j]);printf("\n");for(i=rows-1;i>=0;i--) // 释放free(p[i]); // 2 利用二维指针,生成一个rs*cs得二维动态数组int** pp;int rs,cs;printf("请输入二维数组得行数和列数(间隔空格):");scanf("%d %d",&rs,&cs);pp=(int **)malloc(sizeof(int *) * rs);if(pp==NULL){printf("pp is null");exit(1);}for(i=0;i<rs;i++){pp[i]=(int*)malloc(sizeof(int)*cs);if(pp[i]==NULL)exit(1);}arr2D(pp,rs,cs);for(i=rs-1;i>=0;i--)free(pp[i]);free(pp);// 3 利用数组指针(行指针)生成一个Rows*Cols得动态二维数组,但第二维Cols是固定得一个常量int (*parr)[Cols]; // const int Cols=4;int Rows;printf("请输入二维数组得行数(默认%d列):",Cols);scanf("%d",&Rows);parr=(int(*)[Cols])malloc(sizeof(int)*Rows*Cols);if(parr==NULL)exit(1);for(i=0;i<Rows;i++) // 赋值for(j=0;j<Cols;j++)p[i][j]=i*Cols+j+1;for(i=0;i<Rows;i++) // 输出for(j=0;j<Cols;j++)printf("%4d",p[i][j]);printf("\n");free(parr); getchar();getchar();return 0;}
-End-






