Following previous answer I would add first of all that Just in time debugging is not a compilation option. It enables the debugger to run automatically each time a program generates an exception (when a program 'crashes').
The name of a variable, like 'pi', is just a placeholder to locate the value in memory. So you cannot print as a string whichever variable. A string variable give the address of the sequence of chars in memory, printing 'pi' as a string use its value as a memory address, that is inconsistent. That's why you get memory violation error, you are trying to read a memory that doesn't exist.
The other format are consistent, but if you know what you are doing.
The compiler provides automatic conversion between compatible formats, so a float can be an integer.
Anyway while converting a float to a char, that is an 8 bits wide integer, is not so legal, converting to a char array (string) or an address is absolutely wrong.
The compiler let you do it just because under some special circumstances it is usefull, but this is a very very advanced topic.
Probably you have to read something on programming principles, data type and data access.
Go on more you learn more you'll find it nice