If you want to treat this as a 1d array, you must declare it as so:
void data(int i,int arr[],int size) {
Or:
void data(int i,int *arr,int size) {
The reason is that otherwise, arr[i] is interpreted as an array of 2 integers, which decays into a pointer to the first element (and that's the address that is printed).
Declaring it as a 1-dimensional array will make sure that arr[i] is seen as an int.
Note that whoever calls this function cannot pass a 2D array anymore, or, put another way, cannot make that obvious to the compiler. Instead, you have to pass it a pointer to the first element, as in:
data(0, &arr[0][0], 4);
Or, equivalently:
data(0, arr[0], 4);
This just affects the first call, the recursive call is correct, of course.
In other words, the code should work, you just need to change the declaration of the parameter arr