とりあえず、ソース汚いですけど、これで比べてみてください。

#include<cstdlib>
#include<iostream>
using namespace std;
int main(){
typedef int arrint[10][10];
arrint * p = (arrint *)malloc(sizeof(arrint));
(*(arrint*)p)[0][12] = 12; //OK
((arrint&)p)[0][13] = 13; //OK
reinterpret_cast<arrint&>(p)[0][14] = 14;
cout << "(*(arrint*)p)[1][2] " << (*(arrint*)p)[1][2] << endl;
cout << "(*(arrint*)p)[1][3] " << (*(arrint*)p)[1][3] << endl;
cout << "(*(arrint*)p)[1][4] " << (*(arrint*)p)[1][4] << endl;
cout << "(*(arrint*)p)[0][12] " << (*(arrint*)p)[0][12] << endl;
cout << "(*(arrint*)p)[0][13] " << (*(arrint*)p)[0][13] << endl;
cout << "(*(arrint*)p)[0][14] " << (*(arrint*)p)[0][14] << endl;