我很难过。真的无法解决这个问题。
int main(){
string blah = "text";
example(&blah);
}
void example(string *h){
*h[3]='l';
}
我在上面的函数中尝试做的是编辑原始字符串的第4个字符而不使用全局变量。我以为这会起作用,因为我知道我可以用int来做类似的事情。猜测它与字符串/字符转换有关,但我无法在网上找到太多信息。
答案 0 :(得分:7)
那不是C,它是C ++,通过引用传递,让你的生活更轻松:
void example(string & h){
h[3]='l';
}
将它作为C ++中的指针(在特定的用例中)传递是没有意义的,那就是" C风格"通过引用传递,通过在C ++中引入引用而过时。
通常情况下,如果您打算使用指针运算,那么您想要作为指针传递,这些东西大部分已被C ++标准库容器淘汰,或者为了符合某些已建立的库API - 有很多人大量使用指针,但意图与你的用例略有不同。
BTW,std::string
有一个at()
方法,使用指针可能会更优雅一些:
h->at(3) = 'l';
当然,你也可以从指针调用[]
运算符作为函数:
h->operator [](3) = 'l';
但它有点挫败了目的。
答案 1 :(得分:2)
执行:(*h)[3]='l';
。
由于运算符优先级而发生,[]
位于*
之前。
答案 2 :(得分:1)
问题很简单:由于运营商优先权,*h[3]
相当于*(h[3])
,而不是(*h)[3]
。
有三种方法可以避免这种情况:
在C ++中,您可以通过引用传递对象:
void example(std::string& h)
// ^
{
h[3] = '1';
}
对函数h
内的example
所做的所有更改都在“函数外部”可见。
如果无法更改界面,您可能仍然可以让您的生活更轻松
void example(std::string* h_ptr)
{
assert( h_ptr != nullptr ); // make sure you didn't pass a NULL pointer
std::string& h = *h_ptr; // create a reference from a non-NULL pointer
h[3] = '1';
}
您必须非常小心运算符优先级。最好避免这种解决方案。
void example(std::string* h)
{
(*h)[3] = '1'; // be explicit on the order you want (you will often make mistakes!)
}