In the first function, you pass a pointer to an integer. This means that you will not send the actual value, but the memory address in which this is stored. http://www.cplusplus.com/doc/tutorial/pointers/
In the second function, you pass a reference to an integer. This means that you send a "simpler pointer", that tells that i1 is a way to call the variable outside the function that is passed to it.
You are right that both should work, but they don't have the same functionality at this moment. For the first function to work, you will have to do this:
1 2 3 4 5
void addOne(int* i1){ *i1 += 1; }; // Send a pointer and change the value to which it points (*i1)
...
int n1 = 5;
addOne(&n1);
...
In C, there was no other method than to pass a pointer if you wanted to modify the original object (or avoid copies).
In C++ references are an additional option. You generally use a pointer when the argument is optional (that is to say, it may be 0) and a reference otherwise.