12

Consider the following code fragment:

int (*p)[3];
int (*q)[3];

q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);

I know that pointer arithmetic is intelligent, meaning that the operation q++ advances q enough bytes ahead to point to a next 3-integers-array, so it does not surprises me that the first print is '12, 0' which means that incrementing q made it larger in 12.

But the second print does surprises me. It prints 1!
So why would it print 1 instead of 12? it just puzzles me.

0

2 Answers 2

27

Like the ++ increment operator, the - subtraction operator with pointers also takes into account the size of the objects being pointed to. Specifically, the result returned is the number of bytes difference in the pointer values divided by the size of the pointed-to object (12, in your example). So the difference is 12 bytes, divided by size 12, or 1.

Sign up to request clarification or add additional context in comments.

3 Comments

So there's no way to take two pointers and get their difference in bytes?
Cast the pointers to (char *) then you'll get the difference in bytes.
@Leif: Or just multiply the difference by sizeof(your_type).
4

If you really want to know the difference cast each pointers to a (char*) and then to (int) and then subtract. That should give you the answer.

This code gives you the absolute value:

printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));

Remember to include math.h.

Edit: As pointed out in a comment we don't need a double cast. Casting each pointerpointer to an int and then subtracting gives the same answer as the (unecessary) double casting above.

printf("%d\n", abs((int)(q) - (int)(p)));

1 Comment

That won't work reliably if sizeof(int) < sizeof(pointer). Either cast to intptr_t or just cast to char*.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.