引用与指针的关系
针对于指针与引用的介绍,话不多说,直接开讲。
int a = 10;
int *b = &a;
int &c = a;
cout<<"a本身代表的含义:a= "<<a<<" 对a取地址:&a= "<<&a<<endl;
cout<<"b本身代表的含义:b= "<<b<<" 对b取地址:&b= "<<&b<<" 指针_b的含义:_b= "<<*b<<endl;
cout<<"c本身代表的含义:c= "<<c<<" 对c取地址:&c= "<<&c<<endl;
运行结果如下:
可以看出来:a与c除了名字不一样,其他一摸一样,
也就是说引用&的作用,将c完全相当于实参a,(类似于起别名),
假设fun(int &m), fun(n)则n在函数调用时能够直接修改实参m的值。
a与b比较,b本身的含义代表指向a的地址,*b是对地址取所对应的值,
而 &b是 *p本身在栈中开辟的一个内存地址,也就是说指针是一种间接寻址,
二者其实不是一个地址。
再来举个例子:
void swap(int a,int b){
int c = a;
a = b;
b = c;
}
void swap1(int &a,int &b){
int c = a;
a = b;
b = c;
}
void swap2(int *a,int *b){
int tmp = *a;
*a = *b;
*b =tmp;
}
int main(){
int a=3,b=4;
swap(a,b);
cout<<"第一次交换:"<<a<<" "<<b<<endl;
a = 3;b = 4;
swap1(a,b);
cout<<"第二次交换:"<<a<<" "<<b<<endl;
a = 3;b = 4;
swap2(&a,&b);
cout<<"第三次交换:"<<a<<" "<<b<<endl;
}
运行结果:
可以看出不用指针和引用则无法进行数的交换。
相比较指针,引用使用起来更加简单,不像指针一样频繁对使用*号来进行取值,所以写方法函数时我更加推荐使用引用来进行传参,提高效率,简化代码。
总结:指针间接寻址到实参地址,通过 *b 来对实参进行修改操作
引用相当于直接寻址,类似于起别名,直接能够进行操作实参。