For starters pay attention to that a difference of two pointers has the type ptrdiff_t
. You may not use the conversion specifier %d
with objects of this type. You have to use %td
. As for example
printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);
How does the expression *++ptr is different from ++*ptr?
This expression
*++ptr
is equivalent to
*( ++ptr )
that is at first the pointer is incremented and points to the next element of an array and then it is dereferenced providing an lvalue of the pointed element.
This expression
++*ptr
that is equivalent to
++( *ptr )
that is at first the pointer is dereferenced providing an lvalue to the pointed element and then the element itself is incremented.
As for the shown code
int a[] ={0,1,2,3,4};
int *p[] = {a,a+1,a+2,a+3,a+4};
int **ptr= p;
ptr++;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
*ptr++;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
*++ptr;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
++*ptr;
printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
then initially the pointer ptr
points to the first element of the array p
.
int **ptr= p;
then the pointer is incremented
ptr++;
and now it points to the second element of the array p
.
As a result this expression
ptr-p
yields the number of elements between the two pointers ptr
and p
(in this expression the array designator is converted to a pointer to its first element) that is equal to 1
.
As ptr
points to the element with the value a + 1 of the array p
then the expression
*ptr-a
also yields the value 1
. And the expression
**ptr
yields the value of the expression a[1]
.
This expression-statement
*ptr++;
in fact is equivalent to
ptr++;
because the dereferencing of the pointer does not have a side effect.
Now the pointer points to the third element of the array p
. And this statement
printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);
outputs
2 2 2
Again this statement
*++ptr;
is equivalent to the statement
++ptr;
because the dereferencing does not have a side effect. Now the pointer points to the forth element of the array p
.
And this statement
printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);
outputs
3 3 3
In this statement
++*ptr;
there is incremented the element of the array p
(the forth element) pointed to by the pointer ptr
. That is the forth element of the array is now equal to a+4
So the array p
now looks like
int *p[] = { a, a + 1, a + 2, a + 4, a + 4 };
So this statement
printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);
outputs
3 4 4