They are not the same, and nobody would use the first one.
int *&: Means "a reference to a pointer to an integer".
int &: Means "a reference to an integer".
If the first one were void food(int *x), then:
int *: Means "a pointer to an integer".
Which one you use? In parameters makes little difference except that the concept of a references only exists for C++. If you are programming C, such a concept doesn't exist.
So in general you would use references if you need to pass something by reference because the function wants to change it or because you don't want to create a copy for performance issues.
You would use pointers for the same reasons that you would use references. Just remember that pointers are the ONLY option for C, while in C++ you have a choice between pointer and reference.
You would also pass along a pointer if you NEED a pointer. For instance, construction of a class that requires an instance of some other class to be used, say, as a helper object or to implement member methods.
What is the difference between defining functions like this?
Speaking directly the difference in the types of the parameter. In the first declaration the type of the parameter is a reference to a pointer to int. And in the second declaration the type of the parameter is a reference to an int object.
hehe, Framework: I cannot be held responsible for what Peter said. Don't be mad at me. :-P
Having said that, it is said (as I have never checked myself) that passing primitive types by reference is actually less performant than copying them. Pointers are primitive types, therefore passing them by reference is less performant and not recommended unless you intend to make them point elsewhere.
So yes, I guess I stand corrected: People would only use the first one if there is intent to change the pointer's address.