&amt takes the address of amt, which will be a type_of_amt pointer. For instance if amt is an int, &amt is basically int* -- which needs to be casted to char* because that's the type the function expects.
Does this code mean after get the sizeof(amt) and assign into char *amt?
It takes the size in bytes of amt and requests that that number of characters are read from the file fin and stored in the block of memory starting at the address given by &amt.