Es posible simular una matriz de n filas y m columnas usando un arreglo de n × m elementos mediante la siguiente fórmula:
int main( ) {
int memoria[3 * 5]; // simulando una matriz de 3 filas por 5 columnas
int i, j;
std::cin >> i >> j;
int v = memoria[i * 5 + j]; // equivalente a acceder a la fila i, columna j (nótese que el número de filas no aparece en la fórmula, pero el número de columnas sí)
}
Si quieren tener un apuntador que "no apunte a ningún lado" y quieren poder detectar esto fácil (por ejemplo, para una matriz vacía tal vez no quieran pedir memoria), pueden hacer lo siguiente:
int main( ) {
int* p = nullptr; // intencionalmente "no apunta a ningún lado" (apuntador nulo)
if (p == nullptr) {
std::cout << "p no apunta a memoria valida";
}
}
Usar lo anterior no es realmente necesario, ya que podrían checar si el número de filas o columnas de la matriz es cero para saber si habían pedido memoria o no (o de plano pedirle a new un arreglo de tamaño 0, lo cual es válido), pero ésta es otra alternativa. Es seguro ejecutar delete[] sobre un apuntador nulo.
Un tipo de excepción bastante genérico que podrían usar es std::runtime_error. Revisen las alternativas aquí.