与C ++的指针混淆

时间:2014-09-24 03:11:35

标签: c++ function pointers data-manipulation

我对c ++指针和引用运算符非常困惑。我的主要困惑是以下(简单)代码:

#include <iostream>

using namespace std;

void changeInt(int &a)
{
    a *= 3;
}

int main()
{
    int n = 3;
    changeInt(n);
    cout << n << endl; 

    return 0;
}

主要是,我很困惑为什么更改地址(&amp; a)会改变实际变量(n)。当我第一次尝试这个问题时,这是我的代码:

#include <iostream>

using namespace std;

void changeInt(int &a)
{
    *a *= 3;
}

int main()
{
    int n = 3;
    changeInt(n);
    cout << n << endl; 

    return 0;
}

但这给了我一个错误。为什么当我更改地址时它会更改变量,但是当我更改地址指向的值时,我会收到错误?

3 个答案:

答案 0 :(得分:3)

你的第二个例子是无效的C ++,你只能取消引用一个指针(或一个类型超载operator*的对象,这不是你的情况)。

您的第一个示例通过引用传递参数(int &a不是&#34;&#34;的地址,它是对a的引用,这就是为什么更改为a实际上是对函数传递的对象的更改(在您的情况下为n

答案 1 :(得分:2)

该上下文中的&符号(&)表示引用,而不是“地址”。 E.g:

int some_int;

int & a = some_int; // Declare 'a', a reference to 'some_int'

int * p = &some_int; // '&' in this context is "the address of" 'some_int'

引用在很多方面等同于指针,但它的行为类似于值类型。 请参阅this threadwikipedia entry了解详情。

答案 2 :(得分:1)

&符号表示变量是通过引用函数传递的 - 但在函数内部,变量被视为按值传递。这是syntactic sugar,以使编写接受引用更容易理解的代码。