First:
ptrf = *mat;
*mat is same as mat[0] because1)
*mat -> *(mat + 0) -> mat[0]
So, the statement can also be written as
ptrf = mat[0];
mat[0] is the first 1D arrays of 2D array mat[2][4]. When you access an array, it is converted to a pointer to first element (there are few exceptions to this rule).
So, mat[0] will be converted to pointer to first element of mat[0] array i.e. &mat[0][0] whose type is float * and it will be assigned to pointer ptrf.
Second:
*(mat+2) = pin[2];
*(mat+2) is equivalent to mat[2]1). The type of mat[2] is float [4] i.e. array of 4 float values.
In C, array names are non modifiable lvalues. You cannot assign anything to an array but can only initialise/modify the array members. This statement the violating the language constraint hence, this is invalid. Any compiler which is compliant with the language standards will throw error message on this statement.
One thing you should also note here is that the valid value of first dimension of 2D array mat is 0 and 1. Attempt to use any other value as first dimension of mat array (for e.g. mat[2]) will lead to UB.
Third:
*(mat[0]) = pin[0];
*(mat[0]) is equivalent to mat[0][0]1)
*(mat[0]) -> *((mat[0]) + 0) -> mat[0][0]
that means, its the first member of array mat[2][4]. The type of mat[0][0] is float and the type of pin[0] is also float. This will end up assigning the value of pin[0] to mat[0][0].
Fourth:
ptrf = mat[1];
This is same as first statement, the only difference is here it's mat[1] and in first statement it was mat[0]. This will end up assigning the address of first element of mat[1] array (i.e. &mat[1][0]) to pointer ptrf.
1). C Standards#6.5.2.1
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2)))..