指针与引用的区别
指针从本质上将就是一个存放变量地址的变量,可以被改变,包括其指向的地址、指向地址中存放的数据。
引用是一个别名,存在具有依附性,在一开始就被初始化,而且其引用的对象在整个生命周期中是不能被改变的(只能依附于一个对象)。
指针与引用常用在函数的参数传递,但二者本质上是不同的:
指针传递参数本质上是 值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
而在引用传递过程中, 被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间 接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。
&及*
一.&
&可做引用,也可做取地址符
做引用时
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。必须在定义时初始化。函数中的形参也是引用。
对引用的操作 |
| 对rN 的操作,就是对N的操作。rN-1,则N减少1 |
函数中的形参 |
|
|
做取地址符时
常跟指针联系在一起,某变量(形参或者实参)的地址就用&前置表示要取地址了,取的是该变量的内存地址。
int N = 100;
int *p;
p = &N;
二.*
间接寻址运算符*,可以用来寻址、解引用、赋值
|
|
左边代码块中:
第三行:取地址,得到num的地址
第六行:printf中利用*p解引用,得到p指向的地址保存的值
第七行:赋值,改变p所指的低地址上保存的值
资料来源:(31条消息) 指针(*)、取地址(&)、解引用(*)与引用(&)_c++指针_Adenialzz的博客-CSDN博客
(31条消息) C++ 中的&:“&引用” 和“&取地址符”的区别和作用_c++取址符的作用_非长道的博客-CSDN博客