C++引用和指针&, *

声明变量时
*表示该变量为指针型
&表示该变量为引用型

int a = 12;
int *p;
int &d = a;  //引用必须定义时就初始化

d = *p;
p = &d;

int vala = *p;
int valb = d;

指针的意义是地址,引用的意义是值
所以如上,p是指针,是地址,d是引用是值(所指向地址的值)
所以想获取指针的值,需要*, *p是指针指向的值
想获取引用的地址,需要&,&d是获取引用指向的地址
除却定义时的声明外,*用于从指针取值,&用于从数值取地址

指针就是地址,所以上面代码中,p 可以等于 &d
引用是地址所存储的值,所以d 可以等于 *p


int main()
{
    int i = 100;
    int &y = i;
    int *p = &i;
    int val = 150;
    cout << "Step1, i的地址:" << &i << "=y的指向:" << &y << "=p的值:" << p << "=p指向的值" << *p << endl;
    cout << "p的地址:" << &p << endl;

    y = val;
    cout << "Step2, i的地址:" << &i << "=y的指向:" << &y << "=p的值:" << p << "=p指向的值" << *p << endl;
    cout << "p的地址:" << &p << endl;
}

结果:

Step1, i的地址:004FFE48=y的指向:004FFE48=p的值:004FFE48=p指向的值100
p的地址:004FFE30
Step2, i的地址:004FFE48=y的指向:004FFE48=p的值:004FFE48=p指向的值150
p的地址:004FFE30

可以看到,
引用本身是和指针很类似的东西,都是一个地址,
只不过指针本身就是一个保存地址的变量,指针的值是指向的地址,可以通过获取指针的指向来获取指针指向的值
而引用,就是一个目标地址的拷贝,一个别名,引用等同于原变量,和原变量是完全一样的东西
从上面的结果就可以看得出来,y的地址和原变量的地址一样
指针是系统新分配一个地址来存放指针变量,这个地址存放的是指向的地址
引用没有新分配,它就是原变量。
修改引用就是修改原值。
由于引用只是改变了原地址上的值,地址没变,所以原来指向该地址的指针,获取的值也被改变了。

原文地址:https://www.cnblogs.com/haiton/p/14987377.html