了解参考和解除引用运算符?

时间:2011-07-14 02:47:44

标签: c++

有人可以帮我理解参考和解除引用操作符吗?

这是我到目前为止所阅读/理解的内容:

    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。

5 个答案:

答案 0 :(得分:1)

实际上myFunc的函数参数列表中的&符号不是地址运算符,也不是按位和运算符。它是一个参考指标。这意味着在myFunc内,参数c将是传递给它的任何参数的别名。

答案 1 :(得分: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

  2. 类型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也被修改。