float to int unexpected behaviour

Solution 1:

You don't want to cast the float pointer to an integer pointer. Floats and integers are not stored the same way and if you do that then there is no conversion that will take place, and thus you will get garbage printed to the screen. If however you cast an int-value to a float-value then the compile will convert the float from it's internal type into an integer for you. So you should replace the (int *) with (int).

Also, %d is for decimal(integer) values. What you want is %f, which is for float values, for the first printf.

What you want is this:

#include <stdio.h>

int main()
{
  float a = 12.5;
  printf("%f\n", a); //changed %d -> %f
  printf("%d\n", (int)a); //changed *(int *)& -> (int) for proper conversion
  return 0;
} 

verified here: http://codepad.org/QD4kzAC9

Solution 2:

Floating point numbers are stored in IEEE 754 format. When you pass the %d format specifier to printf() you're telling it to look at the first sizeof(int) bytes starting at &a. Well in the IEEE 754 format this is a bunch of zeros.

I highly recommend you read What Every Computer Scientist Should Know About Floating-Point Arithmetic