通过参数第一个括号传递时,为什么C ++ char数据类型为3d数组为空

时间:2017-02-23 07:08:33

标签: c++ arrays

请查看以下代码:

#include <iostream>
using namespace std;

int main(){

    char matrix[2][2][2];

    return 0;
}

int getMatrixData(char matrix[][2][2], int x, int y, int z) {
    return matrix[x][y][z];
}

当矩阵3d数组作为参数传入函数时,为什么不指定第一个[]大小?如何解释这个缺失的维度?

2 个答案:

答案 0 :(得分:4)

您的代码在语法上是不正确的。假设你的意思是int getMatrixData(char matrix[][2][2], int x, int y, int z)

将数组参数传递给函数时,array decays to pointer传递给第一个元素(在本例中为char [2][2]类型)。 现在一些数组和指针的语法是相似的,所以你找不到太大的区别。

当传递多维数组时,例如在您的情况下为3d,它可以被视为二维数组的数组。因此,您需要在您的情况下给出每个元素char [2][2]的类型,并且您可以跳过最终数组的维度,因为它无论如何都会衰减到指针。 char [2][2]是编译器需要计算每个元素的偏移量的信息。

offset of matrix[x][y][z] = base address of matrix +
                            x * sizeof(char [2][2]) +
                            y * sizeof(char [2]) +
                            z

如果未传递initial元素的维度,则编译器无法解析上述等式中的sizeof。传递跳过的维度是可选的。

答案 1 :(得分:0)

在c ++中,我会以不同的方式使用多维数组。互联网上有很多关于它的主题。

This topic解释了如何使用char***来完成此操作。 E.g:

char getMatrixData(char*** matrix, int x, int y, int z)
{
    return matrix[x][y][z];
}

int main()
{
    char ***matrix = new char**[2];
    for (auto i = 0; i < 2; i++)
    {
        matrix[i] = new char*[2];
        for (auto j = 0; j < 2; j++)
        {
            matrix[i][j] = new char[2];
        }
    }

    getMatrixData(matrix, 1, 1, 1);

    // N.B.! you should normally free the memory using delete []!!
    // But in this case the program ends, so the memory is freed anyhow.

    return 0;
}

但你也可以使用std :: vector type

#include <vector>
using std::vector;

using CharVector1D = vector<char>;
using CharVector2D = vector<CharVector1D>;
using CharVector3D = vector<CharVector2D>;

char getMatrixData(CharVector3D const& matrix, int x, int y, int z)
{
    return matrix[x][y][z];
}

int main()
{
    CharVector3D matrix(2, CharVector2D(2, CharVector1D(2)));

    getMatrixData(matrix, 1, 1, 1);

    return 0;
}

但是,c ++应该是一种面向对象的编程语言。因此,定义矩阵对象可能更好。

#include <vector>
using std::vector;

template <class T>
class Matrix3D
{
private:
    size_t _sizeX;
    size_t _sizeY;
    size_t _sizeZ;
    vector<T> _data;

public:
    Matrix3D(size_t const x_size, size_t const y_size, size_t const z_size)
        : _sizeX(x_size)
        , _sizeY(y_size)
        , _sizeZ(z_size)
        , _data(vector<T> (x_size*y_size*z_size))
    {}

    T GetData(size_t const x, size_t const y, size_t const z) const
    {
        return _data.at(x + (_sizeX * (y + (_sizeY * z))));
    }
};

int main()
{
    Matrix3D<char> matrix(2, 2, 2);

    matrix.GetData(1, 1, 1);

    return 0;
}