Function prototypes do not require the variable names, just their types.
Are they the same? I like your way, its shorter.
Correct. The values passed to the function are copies.
Also, when it gets passed, it like making another copy right?
This is correct. The * means that the variable you are declaring is a pointer.
Others tell me * is "pointer to file type"
The code above tells the compiler that i_hate_pointers is of type "pointer to char"
Here is a little example which may better illustrate:
x = 5;
px = &x; // px is assigned the address of the variable x
printf("The value stored at address 0x%x is %d\n",px,*px);