Почему бы не просто matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]
?
Вы, вероятно, должны передать в функцию более безопасный тип аргумента, чем int matrix[][]
(например, создать какой-то struct MATRIX_2_2
).
Ради упражнения, если вы действительно хотите использовать арифметику указателей, вы, вероятно, захотите написать что-то вроде:
d = (**matrix) * (*(*(matrix + 1) + 1)) - (*(*(matrix + 0) + 1)) * (*(*(matrix + 1) + 0));
Здесь, каждый первый разыменование (это то, что звездочка) получает одномерный массив матрицы, а второй получает определенное значение.