Я вообще - то думал, что mass[3][3] - mass-указатель напервый элемент и long **mass; затем выделяем память, получаем массив, тоже указатель на первый элемент.
Ну ты загнул :) Надеюсь я правильно тебя понял.
Все что идет далее это мое ИМХО:
Объявления long mass1[3][3] и long** mass2 далеко не одно и то же.
В первом случае выделяется память под хранение 3*3=6 элементов long, а во втором
выделяется память лишь для хранения одного указателя, который указывает на другой указатель,
который указывает на long :) Если указателю mass2 насильственно присвоить адрес первого элемента массива
(т.е. mass2=(long**)mass1) то он этот самый элемент будет трактовать как указатель на long,
а инструкция mass2[i][j] (что абсолютно аналогично *(*(mass2+i)+j)) извлечет i-й элемент массива
затем прибавит к нему j и разыменует(!!!) тут мы и получаем ошибку.
Указатель на первый элемент 2мерного массива объявляется так:
long (*p)[3]=mass;
Причем элементы 2мерного массива это не отдельные числа, а целые строки.
Напр.
long mass[4][3]={{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}};
p (или mass) будет указывать на первый элемент группы чисел 1 2 3,
p+1 (или mass+1) - на 4 5 6
p+2 (или mass+2) - на 7 8 9 и т.д.
Вроде так...