在C++函数签名中使用&运算符

Ziv*_*Ziv 24 c++ pass-by-reference

我目前正在阅读Accelerated C++,我意识到我并不真正了解函数签名的工作原理.

int* ptr=#
Run Code Online (Sandbox Code Playgroud)

意味着ptr现在将地址保存为num,但这意味着什么?

void DoSomething(string& str)
Run Code Online (Sandbox Code Playgroud)

从我的理解,这是一个变量的引用传递(这意味着传递地址),但当我这样做

void DoSomething(string& str)
{
  string copy=str;
}
Run Code Online (Sandbox Code Playgroud)

它创造的是str的副本.我认为它会做的是引发错误,因为我正在尝试分配一个指向变量的指针.

这里发生了什么?在函数调用中使用*和&是什么意思?

unk*_*ulu 36

引用不是指针,它们是不同的,尽管它们用于类似的目的.您可以将引用视为另一个变量的别名,即具有相同地址的第二个变量.它本身不包含地址,它只引用与初始化的变量相同的内存部分.

所以

string s = "Hello, wordl";
string* p = &s; // Here you get an address of s
string& r = s; // Here, r is a reference to s    

s = "Hello, world"; // corrected
assert( s == *p ); // this should be familiar to you, dereferencing a pointer
assert( s == r ); // this will always be true, they are twins, or the same thing rather

string copy1 = *p; // this is to make a copy using a pointer
string copy = r; // this is what you saw, hope now you understand it better.
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 26

&C++中的字符是双重目的.它可能意味着(至少)

  1. 取一个值的地址
  2. 声明对类型的引用

您在函数签名中引用的用法是#2的实例.该参数string& str是对string实例的引用.这不仅限于函数签名,它也可以在方法体中发生.

void Example() {
  string s1 = "example";
  string& s2 = s1;  // s2 is now a reference to s1
}
Run Code Online (Sandbox Code Playgroud)

我建议查看参考文献中的C++ FAQ条目,因为它是对它们的一个很好的介绍.


Bo *_*son 13

在进入Accelerated C++的第10章之前,你不应该对指针有任何了解!

引用为其他地方存在的内容创建另一个名称,别名.而已.没有隐藏的指针或地址.不要看幕后!

想想一个名叫罗伯特的人

guy   Robert;
Run Code Online (Sandbox Code Playgroud)

有时你可能想叫他鲍勃

guy& Bob = Robert;
Run Code Online (Sandbox Code Playgroud)

现在鲍勃和罗伯特都指的是同一个人.你没有得到他的地址(或电话号码),只是同一件事的另一个名字.

在你的功能

void DoSomething(string& str)
{
  string copy=str;
}
Run Code Online (Sandbox Code Playgroud)

它的工作原理完全相同,str是另一个存在于其他地方的字符串的另一个名称.

不要理会这种情况,只需将引用视为某个对象的名称.编译器必须弄清楚如何连接名称,您不必.


Man*_*y D 12

在分配变量(即,int* ptr = &value)的情况下,使用&符号将返回变量的地址(在本例中为地址value).

在函数参数中,使用&符号表示您将访问或引用传递给变量内存中的相同物理区域(如果不使用它,则会发送副本).如果您使用星号作为参数的一部分,那么您将指定传递变量指针,这将实现几乎相同的事情.这里的区别在于,使用&符号,您可以通过名称直接访问变量,但是如果传递指针,则必须遵循该指针来获取和操作实际值:

void increase1(int &value) {
   value++;
}

void increase2(int *value) {
   (*value)++;
} 

void increase3(int value) {
   value++;
}
Run Code Online (Sandbox Code Playgroud)

请注意,increase3对您传递的原始值不执行任何操作,因为只发送了一个副本:

int main() {
   int number = 5;
   increase1(number);
   increase2(&number);
   increase3(number);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

number3个函数调用结束时的值是7,而不是8.