a is not a pointer is an array.
So when you subtract a pointer to an another pointer. The result is not really an address, It’s numbers of element between them. The type of the result is
ptrdiff_t and you should print it with
So when you do
&a - &a, you ask how many
int  there are between
&a and the answer is
But when you subtract
a, you have a undefined behavior because:
When two pointers are subtracted, both shall point to elements of the
same array object, or one past the last element of the array object;
the result is the difference of the subscripts of the two array
a are not the same array/pointer. So you should not subtract them. But like I say
a is an array so you have some result like
3. There are some special think about an array. But this is just a “luck”, it’s undefined behavior.
You can only do that
&a[i] - &a[j]; &a[i][j] - &a[i][k]; &a[i][j][k] - &a[i][j][l];
In your case, because
a is an array:
assert(&a - &a == sizeof a / sizeof *a);
Feel free to tell me I’m wrong. I’m not sure of myself in this answer.