(1) a is an array. You can't assign to an array.
(2) a is a pointer. The string literal also decays to a pointer to the first character. However, a string literal is read-only. Therefore you should only point const pointers to it.
If you want a modifiable C-style string:
const char* a = "hello";
If you can't use initialization, then you should use the strcpy library function to copy a string into an array:
char a = "hello";
char a = "hello"; //necessary size deduced from the initialization
(3) You should read about floating point numbers. Short answer: an int stores the number exactly, a floating point represents an approximation of the value and has limited precision. For example, a float will not store a value like 3.45629385648392038460039281 * 10 ^ 50 exactly; some of the precision will be lost and you'll rather end up storing 3.45629385648 * 10 ^ 50.