Descripción general del almacenamiento en memoria de matrices multidimensionales

Últimamente comencé a aprender punteros y referencias en c ++ (no solo el uso habitual de ellos, sino todo tipo de formas, no quiero tener problemas con ellos en un futuro próximo).

Desde mi perspectiva, una matriz asignada estática 1d es similar a un puntero int * const. Mi problema es que, cuando asigno dinámicamente con un puntero, el puntero en sí tiene otra dirección de memoria que el primer elemento, que no es el caso en una matriz 1d. Esto es un ejemplo

int a[5];
cout<<&a<<" "<<&a[0]<<"\n";
int* t=new int[10];
cout<<&t<<" "<<&t[0]<<"\n";

El resultado es:

0x6afed0 0x6afed0
0x6afecc 0xcb0e40

No puedo pensar cómo se almacena la matriz 1d, en 1 bloque de 4 bytes puede almacenar un valor o una dirección. Intenté también con matrices 2d, y hay más intersecciones.

q = new int*[10];
for (i=0;i<10;i++)
    q[i] = new int[i+1];
cout<<&q<<" "<<&q[0]<<" "<<&q[0][0]<<"\n";
int b[10][10];
cout<<&b<<" "<<&b[0]<<" "<<&b[0][0]<<"\n";

Salida:

0x6afee4 0xe40e40 0xe41240
0x6afd54 0x6afd54 0x6afd54

Si alguien me iluminara y explicara cómo se almacenan estas matrices, estaría agradecido.

EDITAR: Para ser más específico, sé y es lógico cómo se almacena la matriz creada dinámicamente con una nueva palabra clave por el puntero. Pero, ¿cómo & a y & a [0] tienen los mismos valores, si a debe almacenar la dirección de un [0]. Ese bloque de memoria (& a) almacena qué, entonces, el valor de a [0] o la dirección de a [0] ] Espero haber sido claro en cuál es mi problema.

Respuestas a la pregunta(4)

Su respuesta a la pregunta