In c++ I would use multidimensional arrays in a different way. There are many topics on the internet about it.
This topic explains how you could do it using a 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;
}
But you could also use the 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;
}
However, c++ is supposed to be an object oriented programming language. So it is probably better to define an matrix object.
#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;
}