No, you can do it without a pointer (or by using a pointer that would be there already, like the stack pointer). When you call a function with the C calling convention, you push the last argument, the second-to-last argument, the third-to-last argument, ..., and finally the first argument onto the stack, and then you call the function (which places another pointer on the stack). So when you call f in the snippet x = 2; f(x,3,4); , the stack looks something like this:
+0x000C: 04 00 00 00
+0x0008: 03 00 00 00
+0x0004: 02 00 00 00
+0x0000: <return pointer>
-0x0004: <uninitialized/junk data>
where these addresses are relative to the register %esp (or maybe %esp+4, I don't remember.) I'm assuming regular old 32-bit here...
Pass-by-reference can be implemented by letting the callee function modify the variables at +0x0004, 0x0008, and 0x000C, and then having its caller use that as its location for that variable. For example, the callee above would use +0x0004 to store the variable x. This means the address is passed to the caller implicitly, not explicitly.
The thing is, this only works if what you're passing by reference is a local variable. Otherwise, the caller would have to copy the passed-by-reference variable's value to the stack when it makes the call and then copy the new version back when the function returns. So you might say, okay, this could be efficient for passing integers by reference, but not, say, vectors or trees or other fancy datastructures. (Actually you'd be just fine with certain types of trees...)
But you've still got one problem: threading. If the program is multithreaded, well, you just can't go making assumptions like having side effects happen whenever you want, waiting for the end of the function before the actual value gets assigned. And that's the reason why a compiler will compile it to have a pointer passed.
But anyway, the original poster is correct. C does not have pass by reference. You pass memory addresses by value. Whether you're trying to solve the same problem as pass by reference doesn't matter; these are language mechanics, not semantics, we are talking about.