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的地址和原变量的地址一样
指针是系统新分配一个地址来存放指针变量,这个地址存放的是指向的地址
引用没有新分配,它就是原变量。
修改引用就是修改原值。
由于引用只是改变了原地址上的值,地址没变,所以原来指向该地址的指针,获取的值也被改变了。