hii there i learned this trick back in my college days to find the size of a variable without the use of sizeof() operator .
It works in almost all cases .Although sizeof () is a operator i think in assembly code it comes down to some piece of more basic code .
don't ask how to find size() if we don't have # define

That i don't know
As cool and hacky as the trick may sound, it's bad code. And not because it does what sizeof() does, but because it is misleading and counter-intuitive. One should take some time out to understand what exactly is happening:
A pointer is nothing but a location to memory, and on a x86 systems it holds a 32-bit address. So effectively it is of type long (4 bytes) = int on x86 architecture.
Code:
int i = 1337;
printf("i(%d) is located at %d, next location is %d\n", i, &i, &i+1);
printf("Number of memory locations: %d - %d = %d\n", &i+1, &i, &i+1 - &i);
printf("Number of bytes : %d - %d = %d\n", &i+1, &i, (long)(&i+1) - (long)&i);
/**
* Output
* i(1337) is located at 1834544, next location is 1834548
* Number of memory locations: 1834548 - 1834544 = 1
* Number of bytes : 1834548 - 1834544 = 4
*/
So without typecasting, the difference between 2 pointers yields the no. of elements or memory locations. But once you typecast the pointer to a long, it is treated as a interger type memory location upon which you can perform the usual arithmetic operations. And what better way to get the number of bytes that to get the difference between 2 consecutive addresses.
So you can ditch that hacky macro, which I'm sure originated from some Indian authored book.