EDIT:  I experimented some, and discovered thing are a bit subtler than I thought.  Here's what I now think is an accurate answer.
&s is not an lvalue so you cannot create a reference to it unless the type of the reference is reference to const.  So for example, you cannot do
string * &r = &s;
but you can do
string * const &r = &s;
If you put a similar declaration in the function header, it will work.
void myfunc(string * const &a) { ... }
There is another issue, namely, temporaries.  The rule is that you can get a reference to a temporary only if it is const.  So in this case one might argue that &s is a temporary, and so must be declared const in the function prototype.  From a practical point of view it makes no difference in this case.  (It's either an rvalue or a temporary.  Either way, the same rule applies.)  However, strictly speaking, I think it is not a temporary but an rvalue.  I wonder if there is a way to distinguish between the two.  (Perhaps it is simply defined that all temporaries are rvalues, and all non-lvalues are temporaries.  I'm not an expert on the standard.)
That being said, your problem is probably at a higher level.  Why do you want a reference to the address of s?  If you want a reference to a pointer to s, you need to define a pointer as in
string *p = &s;
myfunc(p);
If you want a reference to s or a pointer to s, do the straightforward thing.