由于一部分编译器(比如说vs 2019)不支持创建数组时元素个数为变量,今天使用malloc来实现此功能。
详细注释和代码如下
//动态内存分配 模拟二维数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr1[10]; //arr1为数组名,也是数组首元素的地址 也就是 arr1[0]的地址
//二维数组可以看 元素为int [3]类型的 元素个数为2的数组 数组首元素为第一行,arr2[0]为第一行的地址
int arr2[2][3] = { 0 };//arr2[i]: 第i+1行的数组名 每一行都是int [3]数组 int*类型 对于数组来说第i+1行的地址==第i+1行第一个元素的地址. arr:int**类型 对于数组来说 第1行首元素地址的地址 等于第一行第一个元素的地址
//malloc创建行列数可变的二维数组:
int row_num, col_num;
scanf("%d%d", &row_num, &col_num);
//开辟 存放每行首元素地址 空间 每行地址为int*类型 一共row_num个 int*类型的数据,需要用int**指针来访问它们
int** p = (int**)malloc(row_num * sizeof(int*));
//针对每一行,开辟每一个数组元素的空间 ,每行的首元素地址放进之前申请的空间中p[i]可以访问之前申请的空间
for (int i = 0; i < row_num; i++)
{
p[i] = (int*)malloc(col_num * sizeof(int));//p[i]与*(p+i)等价
}
//使用动态内存管理的二维数组
for (int i = 0; i < row_num; i++)
for (int j = 0; j < col_num; j++)
scanf("%d", &p[i][j]);//p[i]找到第i+1行首元素地址p[i][j]找到第i+1行j+1列的元素
//显示动态内存管理方式开辟的内容 和地址
for (int i = 0; i < row_num; i++)
{
for (int j = 0; j < col_num; j++)
{
printf("%d %p ", p[i][j],&p[i][j]);
}
printf("\n");
}
//释放申请的动态内存空间
for (int i = 0; i < col_num; i++)
{
free(p[i]);
}
free(p);
return 0;
}