Why should it print 12? First operand is third object from first, so it is logical to return 3.
This is how pointer arithmetics works: a - b = c such so b + c = a.
Other way to see is a simple math.
by standard:
int might be even 2 bytes long or bytes long, it is irrelevant.
Adding 1 to address of pointer of type X will give you address of next object of type X if this pointer pointed to array element.
To get the distance in bytes you must multiply theresult by sizeof(T), where T could be *ptr. For convenience, pointer distances are measured in elements, not bytes.