微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我们用双指针为矩阵分配内存?

如何解决为什么我们用双指针为矩阵分配内存?

我很难理解这段代码

int **arr = malloc(l * sizeof(int *));
for (i=0; i<l; i++)
  ​arr[i] = (int *)malloc(c * sizeof(int));`
  1. 为什么我们使用双指针而不是一个
  2. 而且我也不明白这段代码背后的逻辑,所以请你逐行向我解释一下。

解决方法

发布的代码分配了一个间接二维矩阵:一个指针数组,每个指针指向一个 int 数组。这允许将矩阵单元格称为 array2D[i][j],并且是经典 C(c99 之前)中可变列数的解决方案。

C99 允许使用一种称为可变长度数组 (VLA) 的新结构,以更有效的方式分配或操作具有可变列数的矩阵。此功能在 C++ 中不可用,它有更具体的方法来表示向量和矩阵。它并未在所有 C 编译器中实现,标准委员会决定从 C11 开始将其设为可选。

以下是使用 VLA 的示例:

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

void matrix_init(int rows,int cols,int matrix[rows][cols]) {
    int n = 0;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = n++;
        }
    }
}

void matrix_print(int rows,int matrix[rows][cols]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("  %d",matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int rows = 3;
    int cols = 4;
    // define `matrix` as a pointer to arrays of `cols` integers.
    // allocate the matrix as an array of such variable length arrays.
    // could also write `calloc(sizeof(int[cols]),rows)` 
    int (*matrix)[cols] = calloc(sizeof(*matrix),rows);
    matrix_init(rows,cols,matrix);
    matrix_print(rows,matrix);
    free(matrix);
    return 0;
}
,

为什么我们使用双指针而不是一个?

双指针用于让语法 x[i][j] 起作用。 简单地说,[] 涉及取消引用并从变量的类型中删除一颗星 (*)。

例如:

int *p;  // p type is int*
p[3];    // p[3] type is int
int **q; // q type is int**
q[2];    // q[2] type is int*
q[2][3]; // q[2][3] type is int
,

指向 int 的指针和指向 int 数组的指针之间有明显的区别。下面是如何为二维数组分配内存的示例。

    int (*array2D)[rows][cols] = malloc(sizeof(*array2D));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。