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++中的字符是双重目的.它可能意味着(至少)
您在函数签名中引用的用法是#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.