No, not for strings, but for built-in types there is no difference. Finally, there is still an alternative to a normal reference (or pointer), a constant reference (or pointer), this way, you have advantage of both ways: No direct access to the actual value, but faster to pass it then by value.
To pass by constant reference, prefix the type name with const: void foo(const string& s) // Faster passing, but the function cannot edit s directly
No direct access to the actual value, but faster to pass it then by value.
Well, technically, you are accessing the actual object directly, but you can only read it, not write to it. Even that can be bypassed with a cast, though.