The short answer is no to both.
REAL(4) does not create an array of reals, it determines the KIND of REAL. I refer you to this question: Fortran 90 kind parameter to explain this.
Secondly, thing1(:,:) does not declare two columns, it declares two dimensions. The first being rows, the second being columns.
Your second would create a 3x3 array "box" of reals of kind == 4, which is typically precision "float" in C language.
I'm not sure what versions,revert is supposed to be.
Also, when creating an array, it is typical, and a little more explicit, to use the DIMENSION parameter as such:
REAL(4),ALLOCATABLE,DIMENSION(:,:,:) :: thing1
which can then be allocated later on as:
ALLOCATE(thing1(x,2,4)) Assuming you still wanted 2 columns, x rows, and an array of 4 in each location.