【问题标题】:Implementaion of 2-D array in meomory using C使用C在内存中实现二维数组
【发布时间】:2020-05-18 12:45:53
【问题描述】:

实际问题 - 在矩阵中找到鞍点。

我的函数调用 - find_saddle_point((Arr,rows);

我的函数原型 - void find_saddle_point(int *,int);

初始化 -

int rows , column ;

int Arr[rows][column];

警告 - 警告:从不兼容的指针类型传递“find_saddle_point”的参数 1

我的临时解决方案 - find_saddle_point(((int *)Arr,rows);

【问题讨论】:

    标签: c multidimensional-array parameters implicit-conversion variable-length-array


    【解决方案1】:

    您声明了一个二维数组。

    int Arr[rows][column];
    

    用于此函数调用中的表达式

    find_saddle_point((Arr,rows);
    

    它被隐式转换为指向其第一个元素的指针,类型为int ( * )[column]

    但是对应的参数有int *类型,并且没有从int ( * )[column]类型到int *类型的隐式转换。

    void find_saddle_point(int *,int);
    

    所以编译器会报错。

    至于你的临时“解决方案”

    find_saddle_point(((int *)Arr,rows);
    

    那么它可能会导致未定义的行为。

    像这样声明函数

    void find_saddle_point( int, int, int [][*]);
    

    在其定义中,您应指定参数的名称。

    void find_saddle_point( int row, int column, int [][column])
    {
        // ...
    }
    

    此外,对于数组的维度,最好使用类型 size_t 而不是类型 int

    这是一个演示程序。

    #include <stdio.h>
    
    void find_saddle_point( size_t, size_t, int a[][*] );
    
    void fill( size_t rows, size_t cols, int a[][cols] )
    {
        for ( size_t i = 0; i < rows; i++ )
        {
            for ( size_t j = 0; j < cols; j++ )
            {
                a[i][j] = i * cols + j;
            }
        }
    }
    
    int main(void) 
    {
        size_t rows = 3;
        size_t cols = 5;
    
        int a[rows][cols];
    
        fill( rows, cols, a );
    
        for ( size_t i = 0; i < rows; i++ )
        {
            for ( size_t j = 0; j < cols; j++ )
            {
                printf( "%2d ", a[i][j] );
            }
            putchar( '\n' );
        }
    
        return 0;
    }
    

    它的输出是

     0  1  2  3  4 
     5  6  7  8  9 
    10 11 12 13 14
    

    当然,这个简单程序中的第一个函数声明是多余的,仅用于演示如何声明具有可变长度数组类型的参数的函数。

    【讨论】:

    • 谢谢先生,这么好的解释,你能解释一下不赞成投票的原因吗,因为我是这个东西的新手。
    • @UtkarshSingh 不是我否决了你的问题。在我看来,这是一个初学者的正常问题。我投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2013-02-10
    • 2012-12-25
    • 2011-03-17
    • 2011-10-04
    相关资源
    最近更新 更多