在 C 中将矩阵声明为双指针是否正确?

问题描述 投票:0回答:1

我是 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];
            }
        }
}
c pointers matrix
1个回答
0
投票

我是通过声明**矩阵来完成的,

我不喜欢这种表示矩阵的方法,但它仍然相对常见。

但是我在其他一些网站上看到了三重指针的声明,但我不明白。

如果希望函数修改调用者传递其地址的双指针(本身),则可以使用三重指针作为函数参数。您提供的代码不依赖于该机制来交换数据。

在我的代码中,我将内存分配解释为将第一个内存分配给每行中的第一个元素,然后为该行中的每个元素分配内存。

您的代码看起来不错,但该描述已关闭。您正在创建的结构是一个指针数组,每个指针都指向不同行的数据。因此,您的第一个分配是针对指针数组的。这些本身都不是您正在建模的矩阵的元素。后面的分配都是针对单行的“所有”元素。

这是正确的还是我的理解完全错误?

你的代码对我来说看起来不错。你的理解有点偏差。

就其价值而言,当我可以依赖固定数组维度或可变修改类型时,我更喜欢使用连续分配的矩阵表示形式。像这样的东西:

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; }

© www.soinside.com 2019 - 2024. All rights reserved.