gpt4 book ai didi

c - 在二维矩阵的上下文中 C 中 ** 和 &** 之间的区别

转载 作者:太空狗 更新时间:2023-10-29 17:26:01 24 4
gpt4 key购买 nike

我正在做一个家庭作业,用动态分配的二维数组做矩阵乘法。我编写了以下函数来加载矩阵:

void loadMatrix(FILE* fp, int** matrix, int rowSize, int colSize) {

for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
fscanf(fp, "%d", &matrix[i][j]);
}
}
}

我将矩阵声明为全局变量,如下所示:

int **a;

然后初始化加载如下:

// allocate memory for the array rows
a = (int **) malloc(m * sizeof(int*));

// allocate memory for array columns
for (int i = 0; i < m; i++) {
a[i] = malloc(k * sizeof(int));
}

loadMatrix(fp, a, m, k);

一切都按预期工作,但是老师提供的函数签名如下:

void loadMatrix(FILE*, int ***, int, int);

我尝试使用该签名,并使用 & 传递矩阵的地址,并从我的 loadMatrix 函数中删除 &,认为输出应该相同,但使用 *** 并没有按预期工作。我错过了什么?如果有的话,使用三重指针还有什么好处?

最佳答案

您的代码存在以下问题:

  • 您不是在分配二维数组,而是在整个堆上分段的基于指针到指针的查找表。这是一种普遍但不好的做法:永远没有理由将二维数组分段并将其分配到多个位置。代码变得复杂,程序变得缓慢,没有任何好处。

  • 没有理由将矩阵声明为全局变量。

  • C 语言中没有理由采用 3 级间接寻址。这被称为“三星级编程”,是程序设计存在根本性缺陷的某种标志。不幸的是,这意味着您的老师不是 C 知识的可靠来源。

相反,您应该分配二维数组:

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

void loadMatrix(FILE* fp, int rowSize, int colSize, int matrix[rowSize][colSize])
{
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
fscanf(fp, "%d", &matrix[i][j]);
}
}
}


int main (void)
{
const int ROWS = 4;
const int COLS = 5;
int (*matrix)[ROWS][COLS]; // array pointer to variable-length array

matrix = malloc( sizeof(int[ROWS][COLS]) );
if(matrix == NULL)
{
// error handling
}

FILE* fp = ...;
loadMatrix(fp, ROWS, COLS, *matrix); // contents of what the pointer points at is the array

free(matrix);
}

要完全理解上述内容,我建议研究可变长度数组以及数组如何衰减为指向第一个元素的指针。

关于c - 在二维矩阵的上下文中 C 中 ** 和 &** 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com