it seems like you are concerned about rotating the blocks while also minimizing the pain of doing so. first, the SDL_Surface* array (4x4) is bad - its a waste of memory. instead of storing the images (4x4 matrix) use booleans or ints to denote whether the block is there, and store the single image for the entire block in one SDL_Surface* variable. to explain, if you have
// and L shape (sort ofbool array[4][4] = {true, true, false, false,true, true, false, false,true true, false, false,true, true, true, true};
you would be able to perform rotations by simple dealing with it like a matrix. using that above (converted to ints), to rotate to the right it'd be
(the 'or' is a separate block, for example purposes)
1 1 0 0 or 1 1 1 11 1 0 0 0 1 1 01 1 0 0 0 1 1 01 1 1 1 1 1 1 1// rotated to the right0 0 0 1 or 1 0 0 10 0 0 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 0 0 1
all you need to do is swap each row with each column (going coutnerclockwise), and thus you only need a RotateRight and RotateLeft function instead of storing the actual position (which you wouldn't need to know to rotate, but would be useful for when it lands).
with the above, to draw you'd either :
1) have an SDL_Surface* object for your block, in which case you would update it (clear and redraw) before blitting to the screen
2) have simply an SDL_Surface* (again, only one - unless you're using an array for effects or something) that contains the block image data. the draw function would loop through the bool (or int) array, and if its true (or of a certain value), blit the block at (x + (iteration * width), y + (iteration * height), width, height).
the other benefit is you can load the block format from a textfile, and thus make your game a little more versatile, in terms of adding content easily (just load the starting config and the image file).
hope that was somewhat useful, and i apologize for the length.
cheers.