将表单int [] []中的变量传递给类型为int的方法**

时间:2016-10-10 23:59:34

标签: c pointers

我有一个二维整数数组和一个从该二维数组中检索特定列的函数。该函数有一个int **作为参数。如何创建一个int **来指向我的int [] []。

int* getColumn(int **matrix, int rows, int column, int columnNum)
{
    ...
}

int main()
{
    int mat[2][2];
    mat[0][0] = 1;
    mat[0][1] = 2;
    mat[1][0] = 3;
    mat[1][1] = 4;

    getColumn( ? , 2, 2, 1);
}

1 个答案:

答案 0 :(得分:3)

没有 easy 方法可以做到这一点,因为它们是完全不同的类型 - 一个是2D数组,另一个是指向(可能是一维数组)指针的指针到(可能是1D阵列)整数。

这是int[2][2]的存储器布局,例如地址5678 :(并假设整数是一个字节,它们并不是在大多数真实系统上,而是让'假装)

Address  5678 5679 5680 5681
        +----+----+----+----+
        | 1  | 2  | 3  | 4  |
        +----+----+----+----+
        ^ address of mat

这是表示相同数组的一个int**的内存布局:

Address  2345 2346 ... 3456 3457 ... 5682
        +----+----+...+----+----+...+----+----+
        | 1  | 2  |...| 3  | 4  |...|2345|3456|
        +----+----+...+----+----+...+----+----+
                                    ^ address of mat2

如你所见,它们并不相同。主要的区别在于,int**表示允许每一行都在一个完全不同的地址,并且"矩阵"实际上是一个包含指向每一行的指针的数组

但是,可以自己创建指向每一行的指针数组:

int *rows[2] = {
    mat[0],
    mat[1]
};
getColumn(rows, 2, 2, 1);

但如果你的矩阵总是不一样,这会很复杂。

(这个的内存布局是:

Address  5678 5679 5680 5681 ... 5700 5701
        +----+----+----+----+...+----+----+
        | 1  | 2  | 3  | 4  |...|5678|5680|
        +----+----+----+----+...+----+----+
        ^ address of mat        ^ address of rows