在函数调用中,*和&运算符的区别
在函数调用中,*和&运算符的区别
我想知道在C++函数调用中,地址运算符`&`和解引用运算符`*`的区别。例如,考虑以下函数:\n
void foo (std::string& param) { param = "Bar."; std::cout << param.size(); }
\n然后在`main()`函数中调用它,如下所示:\n
int main() { std::string test; foo(test); //为什么不是foo(&test)? std::cout << test; //输出"Bar." }
\n首先,为什么地址运算符`&`允许我像指针一样分配一个值(给它分配一个在函数`foo()`的RAII和作用域之外仍然存在的值),即使它不是指针,我仍然可以在`main()`函数中打印出它的值,而不是使用`static`关键字?我假设它不是指针,因为我可以使用`.`运算符而不是指针所使用的`->`来访问`size()`方法。\n其次,在函数参数中使用地址运算符`&`和解引用运算符`*`有什么区别?它与使用普通变量(例如`std::string param`)有什么不同?它似乎是这样调用的(`foo(test)`而不是`foo(&test)`)。
在函数调用中,使用*和&运算符的区别是什么?
问题的出现是因为在函数调用中,使用*和&运算符会导致参数的传递方式不同。使用*运算符时,会将参数的副本传递给函数,而使用&运算符时,则会传递参数的引用。
对于不需要引用的情况,最佳实践是将所有对象都以const引用的方式进行传递。
解决方法是根据具体的需要选择合适的运算符。如果需要传递参数的引用,就使用&运算符;如果需要传递参数的副本,就使用*运算符。
以下是一个示例代码,用于说明使用*和&运算符的不同效果:
#includevoid modifyStringByPointer(std::string* str) { *str += " (modified by pointer)"; } void modifyStringByReference(std::string& str) { str += " (modified by reference)"; } int main() { std::string str = "Hello"; std::cout << "Original string: " << str << std::endl; modifyStringByPointer(&str); std::cout << "String after modification by pointer: " << str << std::endl; modifyStringByReference(str); std::cout << "String after modification by reference: " << str << std::endl; return 0; }
在上述示例代码中,首先定义了两个函数`modifyStringByPointer`和`modifyStringByReference`,分别使用*和&运算符来修改传入的字符串参数。
在主函数中,首先打印出原始字符串的值,然后分别调用了`modifyStringByPointer`和`modifyStringByReference`函数来修改字符串。
最后,打印出经过修改后的字符串的值。
运行以上代码,输出结果如下:
Original string: Hello String after modification by pointer: Hello (modified by pointer) String after modification by reference: Hello (modified by pointer) (modified by reference)
可以看到,使用*运算符传递参数时,函数内部对参数进行修改后,原始字符串的值并没有改变。而使用&运算符传递参数时,函数内部对参数进行修改后,原始字符串的值也随之改变。
这说明使用*运算符时,函数只对参数的副本进行操作,不会影响原始数据;而使用&运算符时,函数直接对参数的引用进行操作,会影响原始数据。
因此,在函数调用中,根据需要选择合适的运算符可以确保参数的传递方式正确无误。