No. Esto último sería una matriz de matrices, no una matriz bidimensional.
Una matriz bidimensional es lo mismo que una matriz unidimensional, solo que está particionado el espacio:
Matriz unidimensional de 16 elementos: 0-15
|00,01,02,03,04,5,06,07,08,09,10,11,12,13,14,15|
Matriz bidimensional de 4x4 elementos: =0-3x0-3
|00,01,02,03|00,01,02,03|00,01,02,03|00,01,02,03|
Así calcular el puntero absoluto de una dimensión es realtivo al puntero absoluto del primer ítem del array...
Además piensa que el puntero, apunta a una estructura y es en dicha estructura donde se apunta al primer elemento de la matriz.
Sería algo así:
array x ----> estructura safeArray ----> puntero al array.
La estructura mantiene los datos básicos del array. Como el tipo de datos que aloja y cuantos bytes por elemento utiliza así como un simple array de las dimensiones en que se subdivide el array, etc...
typedef struct tagSAFEARRAY {
USHORT cDims;
USHORT fFeatures;
ULONG cbElements;
ULONG cLocks;
PVOID pvData; // puntero a los datos del array
SAFEARRAYBOUND rgsabound[1]; // otra estructura con dos elementos, el valor del índice menor y la cantidad de elementos.
} SAFEARRAY, *LPSAFEARRAY;