C++——&及*

指针与引用的区别

指针从本质上将就是一个存放变量地址的变量,可以被改变,包括其指向的地址、指向地址中存放的数据。

引用是一个别名,存在具有依附性,在一开始就被初始化,而且其引用的对象在整个生命周期中是不能被改变的(只能依附于一个对象)。

指针与引用常用在函数的参数传递,但二者本质上是不同的:

  • 指针传递参数本质上是 值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

  • 而在引用传递过程中, 被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间 接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

  • 引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。

&及*

一.&

&可做引用,也可做取地址符

  1. 做引用时

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。必须在定义时初始化。函数中的形参也是引用。

对引用的操作

int N;
int &rN = N;

对rN 的操作,就是对N的操作。rN-1,则N减少1

函数中的形参

int func1(int i){
    i++
    return i;
}
int func2(int &i){
    i++;
    return i;
}
int x = 5;
func(x);//返回值:6, x :5        
func2(x);//返回值:6, x :6
//没有&,不会改变实参的值

  1. 做取地址符时

常跟指针联系在一起,某变量(形参或者实参)的地址就用&前置表示要取地址了,取的是该变量的内存地址。

int N = 100;
int *p;
p = &N;

二.*

间接寻址运算符*,可以用来寻址、解引用、赋值

int main(){
    int num = 7;  
    int* p = #  
    printf("数值%d所在的地址是 %p\n", num, p);  
    printf("指针p所指向的地址为 %p , 
             该地址上所保存的值为%d\n", p, *p);  
    *p = 100;  
    printf("指针p所指向的地址为 %p , 
             该地址上所保存的值为%d\n", p, num);  
    return 0;  
}
//输出
数值7所在的地址是 0x7ffeefbff3b8
指针p所指向的地址为 0x7ffeefbff3b8 , 该地址上所保存的值为7
指针p所指向的地址为 0x7ffeefbff3b8 , 该地址上所保存的值为100

左边代码块中:

第三行:取地址,得到num的地址

第六行:printf中利用*p解引用,得到p指向的地址保存的值

第七行:赋值,改变p所指的低地址上保存的值

资料来源:(31条消息) 指针(*)、取地址(&)、解引用(*)与引用(&)_c++指针_Adenialzz的博客-CSDN博客

(31条消息) C++ 中的&:“&引用” 和“&取地址符”的区别和作用_c++取址符的作用_非长道的博客-CSDN博客

(36条消息) C++中指针和引用的区别(超详细)_引用 指针_WeiKangC的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值