void f(int x) {}
The function will have a copy of the object, it will be temporary so don't use it if you want to modify the value or pass a large amount of data.
void f(int& x) {}
Same but passed by reference so it's kind of a pointer from the c but you can use it like a usual object. You will be able to modify it and it's better to pass large amount of data because the compiler doesn't have too copy it.
void f(const int& x) {} const before the argument mean that the object can't be modified. And by the way you don't have to declare it as const in your main.
I'm not sure for the function calling case part so I won't answer that ;)