如果动态定义一个m行, n列的2维数组(经典面试题)

C语言里,所有变量空间都是在程序运行之初向系zd统申请的,
包括指针,除了一些动态申请方式如malloc函数。
没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。所以,解决的办法便是通过malloc函数。
首先要明白,二维数组本质上也是一维的,二维只是人为想象出的空间感。
其实二维数组a[i][j]的不同之处在于,它的数组名a是一个二级指针,它直接指向一个指针数组(元素都是指针的数组),a中储存的就是该指针数组的首地址,该指针数组里存储的指针按顺序指向每一行元素的首地址。因此,该指针数组的长度,即为二维数组的行数i。
a[i](即*(a+i))访问的是指向第i行的指针,a[i][j](即*(*(a+i)+j))访问的是第i行第j列的元素。
由此我们可以知道,想要动态地初始化一个二维数组的步骤如下:
1.定义一个二级指针a(以整形为例);
2.使这个二级指针指向一个指针数组,即为a分配长为i的指针数组的地址;
3.通过对a[i]的访问,为二维数组的每行元素申请地址,申请的大小由列宽j决定;
 

# define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
# include <assert.h>
# include<stdlib.h>
//如果动态定义一个m行, n列的2维数组(经典面试题)
int main()
{
    int m, n;//m行,n列
    scanf("%d %d", &m, &n);
    int** arr = (int**)malloc(m * sizeof(int*));
    assert(arr != NULL);
    for (int i = 0; i < m; i++)
    {
        arr[i] = (int*)malloc(n * sizeof(int));
    }

    int k = 0;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            arr[i][j] = k++;//
    }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }

    //释放内存
        for (int i = 0; i < m; i++)
            free(arr[i]);
    free(arr);

    return 0;
}
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秉麟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值