char* generally stores the address of char type,here it stores the address of int type.
since char occupy 1 byte memory space while int occupy 2 byte or 4 byte(machine & compiler dependent) space in memory. so on increment in p it will refer to next byte incremented by 1 while the next value is 2 or 4 byte from that address of arr . what I mean to say is that.
Suppose arr has an address of 2000 so p=arr means p has an address of arr.
but arr is of type int so arr will be stored in address 2004.
and on increasing the pointer with value 1 it will point to 2001(as it is of char type) which doesn't contain the value arr. so it will result out 0.
you can refer to arr by :-
p=(int*)(p+2);//if int take 2 bytes
p=(int*)(p+4);//if int take 4 bytes