C++中的引用和指针


先看下面一段关于引用的说明:

引用是C++比C扩充的一种派生数据类型。引用是为对象取一个别名,不占存储空间。
引用类型说明符为&
例:
int someInt;
int& rInt = someInt;
注意,在这里引用类型变量rInt是someInt的一个别名,也就是这两个表示的是同一个变量。它们指向的是同一个内存空间。
声明一个引用变量时,必须同时使之初始化,即声明它代表哪一个变量。并且从此不可改变。
一旦一个引用被初始化后,就不能改为指向其他对象。
引用类型的引入最大的好处,可以用来作形参:
如:void swap(int& a, int& b) { …… };

----------------------------------------
可以看到,引用的说明符“&”与取地址符是同一个符号,虽然他们是同一个符号,但是不要混。看下面:

int i = 3; //声明int类型的变量i, 并初始为3
int &rI = i; //这里的“&”是在左边,把它认为只是一个符号,或者只是一个标识,表示变量rI是一个引用类型而以
int *pI = &i; //这里的“&”是在右边,表示取地址操作,它是一个操作符;
        //经过“&”操作后的变量是一个指针,所以左边必须声明为一个指针类型。

从上面的这三行代码可以看出,引用说明符“&”只是一个符号,不要与取地址符混淆就行了。
这个与“*”类似,“*”放在左边也只是一个符号,说明是一个指针类型的变量;放在右边做为操作符,则表示对指针变量进行解指针操作。
引用表示这个变量是原来的变量的一个别名,它们指向的是同一个内存空间。所以引用的对象的类型,原来是什么类型,那么该引用所代表的就是什么类型。
而取地址符“&”,操作后的类型是一个指针类型的变量。与引用是不一样的。

----------------------------------------
再看一个小例子,结合输出结果体会一下:

void testRf()
{
    int i = 30, j = 40;
    int &rI = i;
    int *pI = &i;
    int *pRI = &rI;

    cout << "i, j的值(i, j): (" << i << ", " << j << ")   地址: (&i, &j): (" << &i << ", " << &j << ")" << endl;
    cout << "rI: " << rI << "  pI:" << pI << "  pRI:" << pRI << endl;

    rI = j;
    int *pRI2 = &rI;

    cout << "尝试改变rI的引用, rI: " << rI << endl;
    cout << "此时i, j的值(i, j) : (" << i << ", " << j << ")  地址: (&i, &j): (" << &i << ", " << &j << ")" << endl;
    cout << "pRI2: " << pRI2 << endl;

    cout << "rI = " << rI << "  *pI = " << *pI << endl;
}

输出结果:
i, j的值 (i, j): (30, 40)   地址: (&i, &j): (0013FE8C, 0013FE80)
rI: 30  pI:0013FE8C  pRI:0013FE8C
尝试改变rI的引用, rI: 40
此时i, j的值 (i, j) : (40, 40)  地址: (&i, &j): (0013FE8C, 0013FE80)
pRI2: 0013FE8C
rI = 40  *pI = 40

从上面的输出可以看出:
引用类型rI,与原来的类型i是一致的,都是int型,且指向同一块内存地址。可以认为rI是i的别名,两个是同一个变量;
引用类型初始化之后,便不可改变。这里的不可改变可以理解为引用类型所指向的地址不变。上例中,当尝试 rI=j 进行赋值,结果是将内存中原来 rI 对应的值给覆盖了。因此,i的值也变成了4;

相关内容