如何在 C 中使用 poiners 在函数中传递静态矩阵?

How to pass static matrix in a function with poiners in C?

提问人:Roman Ambrosevich 提问时间:10/23/2023 更新时间:10/24/2023 访问量:33

问:

我需要通过内存程序进行优化,所以我决定使用带有静态矩阵的指针,但是我对 C 中的指针了解不多,并且程序不起作用(在 VS 程序中抛出异常)

#include <stdio.h>

int Sumofsum(int **matrix, int size) {
    int sum = 0;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

void SumofSumOut(int sum) {
    printf("Sum of sums of elements in those rows: %d\n", sum);
}

int main() {
    int matrix[5][5] =
            {
                    {21,8, 3, 4, 5},
                    {1, 3, 5, 7, 9},
                    {2, 4, 6, 8, 9},
                    {1, 3, 4, 5, 7},
                    {3, 3, 3, 3,11}
            };
    int sum, size = 5;
    sum = Sumofsum(matrix, size);
    SumofSumOut(sum);
    return 0;
}

我尝试使用(*矩阵)[5],但这不是我需要的

C 矩阵 多维数组 参数传递

评论


答:

0赞 ikegami 10/24/2023 #1

int **matrix指示指向指针的指针。这就是会退化成的东西。int *matrix[]

您没有指针数组。


将数组视为 1d:

int sum_of_sum( int *matrix, int size ) {
    int sum = 0;
    for ( int i = 0; i < size; ++i ) {
        for ( int j = 0; j < size; ++j ) {
            sum += matrix[ i * size + j ];
        }
    }
    return sum;
}

sum_of_sum( &matrix[0][0], size )

将指针传递到第一行。

int sum_of_sum( int size, int (*matrix)[ size ] ) {
    int sum = 0;
    for ( int i = 0; i < size; ++i ) {
        for ( int j = 0; j < size; ++j ) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

sum_of_sum( size, matrix );

传递指向数组的指针。

int sum_of_sum( int size, int (*matrix)[ size ][ size ] ) {
    int sum = 0;
    for ( int i = 0; i < size; ++i ) {
        for ( int j = 0; j < size; ++j ) {
            sum += matrix[i][j];
        }
    }
    return sum;
}


sum_of_sum( size, &matrix );

评论

0赞 ikegami 10/24/2023
另外:实际使用一维数组。
0赞 Roman Ambrosevich 10/24/2023
会消耗比 ?int sum_of_sum( int size, int (*matrix)[ size ] )int sum_of_sum(int size, int matrix[size][size])
0赞 ikegami 10/24/2023
不。作为参数,表示 。作为参数,这意味着:指向 s 数组的指针。这三者都是 100% 等效的。int matrix[size][size]int matrix[][size]int (*matrix)[size]sizeint
0赞 ikegami 10/24/2023
事实上,提供的每个解决方案都使用完全相同的内存量(一个指针)。唯一的区别是指针的类型。甚至在所有情况下,地址都是相同的。但事实并非如此。优化编译器肯定会为每个解决方案生成完全相同的代码。这也适用于实际使用一维数组(未显示)。 占用的内存量与 完全相同。int matrix[5][5]int matrix[5*5]