You need a pointer to a pointer to create a [normal] 2-dimensional array
so
int ** const e;
Then the constructor can work like:
e = (int**) malloc(sizeof(int**) * a);
for(int i=0;i<a;++i) {
e[i] = (int*) malloc(sizeof(int*) * b);
}
Your next problem is "how to initialize the constants". For this, you can refer to the answer here:
how to initialize const member variable in a class C++
to implement this, put the inittializer code in a function:
initConstArray(const int** const a, int r, int c) {
e = (int**) malloc(sizeof(int**) * a);
for(int i=0;i<r;++i) {
e[i] = (int*) malloc(sizeof(int*) * b);
for(int j = 0;j < c; ++j) {
e[i][j] = a[i][j];
}
and call this function from the constructor initializer list:
A(int **a, int r, int c) : initConstArray(a, r, c) {
}