在函数调用中,*和&运算符的区别

33 浏览
0 Comments

在函数调用中,*和&运算符的区别

我想知道在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)`)。

0
0 Comments

在函数调用中,使用*和&运算符的区别是什么?

问题的出现是因为在函数调用中,使用*和&运算符会导致参数的传递方式不同。使用*运算符时,会将参数的副本传递给函数,而使用&运算符时,则会传递参数的引用。

对于不需要引用的情况,最佳实践是将所有对象都以const引用的方式进行传递。

解决方法是根据具体的需要选择合适的运算符。如果需要传递参数的引用,就使用&运算符;如果需要传递参数的副本,就使用*运算符。

以下是一个示例代码,用于说明使用*和&运算符的不同效果:

#include 
void 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)

可以看到,使用*运算符传递参数时,函数内部对参数进行修改后,原始字符串的值并没有改变。而使用&运算符传递参数时,函数内部对参数进行修改后,原始字符串的值也随之改变。

这说明使用*运算符时,函数只对参数的副本进行操作,不会影响原始数据;而使用&运算符时,函数直接对参数的引用进行操作,会影响原始数据。

因此,在函数调用中,根据需要选择合适的运算符可以确保参数的传递方式正确无误。

0
0 Comments

在函数调用中,*和&运算符的区别是出现的原因是为了区分传递引用和传递指针的方式。其中,&运算符表示该参数是通过引用传递的(传统上,编译器会将其实现为指针),这就是为什么你在main()函数中看到了这个赋值的效果。而static与此无关。

使用*和&声明函数参数的区别在于,第二种方式允许传入nullptr(或者不存在或无效的地址),而&保证函数参数引用的是一个真实的对象。除此之外,两者都提供了类似的功能,即通过引用改变原始对象。

解决方法:根据需要选择使用*还是&运算符来声明函数参数,以实现传递指针或传递引用的目的。

0