about *ptr-arr here is the debug code. Hope you figure this out need to sleep now. Sorry for no comments i can do it later if there are questions.
#include<stdio.h>
int main()
{
static int arr[]={0,1,2,3,4};
int *p[]={arr,arr+1,arr+2,arr+3,arr+4};
int **ptr=p;
printf("size of int %d\n", sizeof(int));
printf("ptr before changes %d\n", ptr);
printf("p before changes %d\n", p);
printf("arr before changes %d\n", arr);
printf("*ptr before changes(points to arr) %d\n", *ptr);
ptr++;
printf("ptr after increment %d\n", ptr);
printf("*ptr after increment(arr+1) %d\n", *ptr);
printf("\n How many separate ptr and p [%d] %d %d \n",ptr-p,*ptr-arr,**ptr);
*ptr++;
printf("\n %d %d %d \n",ptr-p,*ptr-arr,**ptr);
*++ptr;
printf("\n %d %d %d \n",ptr-p,*ptr-arr,**ptr);
++*ptr;
printf("\n %d %d %d \n",ptr-p,*ptr-arr,**ptr);
return 0;
}
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/BitOp/pointer.html
Dont be afraid to add as much printf as possible.