我是 C 编程语言的新手,我不知道我的代码是否正确且足够高效,或者是否存在我的误解。我唯一想做的就是在主函数中为 n 行 m 列的矩阵分配动态内存。然后,我想通过引用函数matrix_access 传递它来初始化它。最后,我只是打印这些值来验证矩阵是否已正确初始化。
我是通过声明 **matrix 来完成的,但我在其他一些网站上看到声明为三重指针,但我不明白。在我的代码中,我将内存分配解释为将第一个内存分配给每行中的第一个元素,然后为该行中的每个元素分配内存。这是正确的还是我的理解完全错误?
提前非常感谢。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
void matrix_access(double ** matrix, int n, int m);
int main()
{
int n = 5, m = 4;
double **matrix = malloc(n * sizeof(double*)); // pointer to the first element of each row
for (int i = 0; i < n; i++)
{
matrix[i] = malloc(m * sizeof(double)); // pointer to each element in the row
}
matrix_access(matrix,n,m);
printf("The values are\n");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
printf("%lf ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
void matrix_access(double ** matrix, int n, int m)
{
int arr1[5][5] = { { 0, 1, 2, 3},
{ 2, 3, 4, 5},
{ 4, 27, 6, 7},
{ 5, 4, 3, 2},
{ 2, 5, 4, 3} };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
matrix[i][j] = arr1[i][j];
}
}
}
我是通过声明**矩阵来完成的,
我不喜欢这种表示矩阵的方法,但它仍然相对常见。
但是我在其他一些网站上看到了三重指针的声明,但我不明白。
如果希望函数修改调用者传递其地址的双指针(本身),则可以使用三重指针作为函数参数。您提供的代码不依赖于该机制来交换数据。
在我的代码中,我将内存分配解释为将第一个内存分配给每行中的第一个元素,然后为该行中的每个元素分配内存。
您的代码看起来不错,但该描述已关闭。您正在创建的结构是一个指针数组,每个指针都指向不同行的数据。因此,您的第一个分配是针对指针数组的。这些本身都不是您正在建模的矩阵的元素。后面的分配都是针对单行的“所有”元素。
这是正确的还是我的理解完全错误?你的代码对我来说看起来不错。你的理解有点偏差。
就其价值而言,当我可以依赖固定数组维度或可变修改类型时,我更喜欢使用连续分配的矩阵表示形式。像这样的东西:
void matrix_access(int n, int m, double (*matrix)[m]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
matrix[i][j] = (double) rand() / RAND_MAX;
}
}
}
int main(void) {
int n = 5, m = 4;
double (*matrix)[m] = malloc(n * sizeof(*matrix)); // all elements
matrix_access(n, m, matrix);
printf("The values are\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%lf ", matrix[i][j]);
}
printf("\n");
}
free(matrix); // only one free needed for the whole matrix
return 0;
}