有人可以帮我理解参考和解除引用操作符吗?
这是我到目前为止所阅读/理解的内容:
int myNum = 30;
int a = &myNum; // a equals the address where myNum is storing 30,
int *a = &myNum; // *a equals the value of myNum.
当我看到下面的代码时,我很困惑:
void myFunc(int &c) // Don't understand this. shouldn't this be int *c?
{
c += 10;
cout<< c;
}
int main()
{
int myNum = 30;
myFunc(myNum);
cout<< myNum ;
}
int &c
有正确传递的地址吗?这不是传递的价值。
所以,当我c+=10
时,它会将10加到内存地址而不是值30.这是正确的吗?
但是...当我运行这个...当然有所有正确的包含和东西......它的工作原理。它打印40。
答案 0 :(得分:1)
实际上myFunc
的函数参数列表中的&符号不是地址运算符,也不是按位和运算符。它是一个参考指标。这意味着在myFunc
内,参数c
将是传递给它的任何参数的别名。
答案 1 :(得分:1)
这里有一些问题。
您的第二行代码int a = &myNum; // a equals the address where myNum is storing 30
错误;
你可以将它与第3行结合起来如下:
int *a = &myNum; // a equals the address where myNum is stored;
*a == myNum
。
类型int &
被读作“reference-to-int”。也许Wikipedia article可以帮助您理解这意味着什么。
答案 2 :(得分:1)
这两段代码都是有效的,您对第一段代码中指针的理解是正确的。但是,两段代码中的&符号(&amp;)实际上是不同的东西。 (就像*是取消引用和乘法运算符一样)
第二段代码显示&amp;可用于通过引用将变量传递给函数。通常,如果你有这样的代码:
int a;
void foo(int bar) {
bar = 3;
}
int main() {
a = 5;
foo(a);
// a still equals 5
}
对'foo()'的调用不会影响您传递给它的变量(bar
或在这种情况下a
)。但是,如果您更改了此行:
void foo(int bar) {
到
void foo(int &bar) {
然后它会影响变量,在上面的程序结束时,a
的值将为3。
答案 3 :(得分:0)
在C ++中,当您使用int &c
通过引用传递内容时,您不需要取消引用。您只需要取消引用指针。如果是int *c
那么就有必要了。请记住,在这两种情况下,您都会更改原始调用者传递的值,因此myNum现在为40。
答案 4 :(得分:0)
让我们先看一下假设:
int myNum = 30;
// this won't compile. &myNum is the address of an int (an int *), not an int:
int a = &myNum;
// *a is a pointer to an int. It received the address of myNum (which is &myNum),
// and not its value
int *a = &myNum;
关于代码:
void myFunc(int &c)
// c is passed by reference. This is a kind of "hidden pointer" that
// allows using the variable as if it was not a pointer but the pointed variable.
// But as this reference and the variable that was passed by the caller (myNum
// in your example) share the same address (this is the property of a reference),
// any modification of the value of c inside myFunc modifies it in the
// caller's scope too (so here, it modifies myNum).
{
c += 10;
cout<< c;
}
int main()
{
int myNum = 30;
myFunc(myNum); // displays 40
// What follows displays 40 as well, due to the fact
// c was passed by reference to myFunc that added 10 to it
cout<< myNum ;
}
所以当我做c + = 10时,它会将10加到内存地址而不是 价值30.这是正确的吗?
不,c
的{{1}}值增加了10。
由于myFunc
是收到c
的引用(指向“隐藏指针”),因此myNum
也被修改。