C语言定义并初始化一个二维数组(利用二级指针)

Guanjie Sun / 2023-08-06 / 原文

C语言定义并初始化一个二维数组(利用二级指针)

1.代码如下

#include <stdio.h>
#include <stdlib.h>

int main() {
    // m, n表示数组的行数和列数
    int m, n;
    scanf("%d %d", &m, &n);
    // p是一个二级指针,使用malloc函数初始化。注意p指向的是一个指针,所以sizeof操作符的操作数是int*,表示分配一个int型指针的内存空间
    // 分配m个int型指针所占用的内存空间,并将这片内存空间的基地址(首个元素的地址)返回给二级指针p
    int** p = (int**)malloc(sizeof(int*) * m);

    // p[i]是一个指针,每一轮循环都分配n个int型大小的内存空间,并将这片内存空间的首地址返回给p[i]
    for ( int i = 0; i < m; i++) {
        p[i] = (int*)malloc(sizeof(int) * n);
    }

    // 为二维数组的每一个元素赋值
    for ( int i = 0; i < m; i++) {
        for ( int j = 0; j < n; j++) {
            scanf("%d", &p[i][j]);
        }
    }
    
    // 打印每一个二维数组的元素
    for ( int i = 0; i < m; i++) {
        for ( int j = 0; j < n; j++) {
            printf("p[%d][%d]=%d ", i, j, p[i][j]);
        }
        printf("\n");
    }
    
    // 释放指针p[i]指向的内存空间,并将指针的值置为0
    for ( int i = 0; i < m; i++) {
        free(p[i]);
        p[i] = NULL;
    }
    // 释放二级指针p指向的内存空间,并将指针的值置为0
    free(p);
    p = NULL;
    return 0;
}

2.输入输出测试

第一行输入二维数组的行和列

3.代码可视化(pythontutor.com)

在这个网站上无法进行scanf的输入, 因此需要对代码做一写改动才可以在pythontutor.com上运行并可视化。