引用和指针一(侧重引用)

1、一般而言,&在 = 边,表示引用;                       

                        &在 =边,表示取地址

       eg、int &rn = a;//rn为普通变量a引用,即为a的别名,共享内存,占同一个内存空间。        

               int* p = &a;//定义指针p并初始化为a的地址,即p指向a,其中a为普通变量(省略其定义)

2、引用必须也只能在声明的时候初始化,以后均不能把该引用作为其他变量名的别名。

3、野指针:指针p没有进行初始化---->此时指针p为野指针----->若此时对其内容进行赋值,会产生无法预料的情况,可能导致程序崩溃。      

最好养成定义指针p就直接给他初始化,一定要避免野指针的出现!!!

4、  参数为指针引用型,如void swap(char *&x,char *&y){}  则传入函数的就是实参,不是形参!【引用直接在原内存地址上修改内容,可看成可以传出函数。】

     如果参数不为指针引用,那么指针交换只能在swap中有效,无法带出函数体,因为在函数体中,函数栈会分配两个临时的指针变量分别指向两个指针参数,对实际的字符串无效。

        如果参数采用二级指针,则同样可以传出函数,达到字符串交换的目的。

5、参数引用

const float pi = 3.14f;

float f;//全局变量

float f1(float r){

    f = r*r*pi;

    return f;

}

float& f2(float r){

    f = r*r*pi;

    return f;

}

int main() {

    float  f1(float=5);//默认参数调用,其默认值为5

    float  f2(float=5);

    float  a=f1();//正确。

    float&  b=f1();//错误!!!在f1函数中,全局变量f的值会先赋给一个临时变量temp,然后建立这个变量的引用b。这里对临时变量进行引用会发生错误。【这个temp变量由编译器隐式建立】

    float  c=f2();//正确。返回的引用,没有隐式地建立临时变量,直接返回的是全局变量

    float&  d=f2();//正确。这种方法最节省内存,但要注意其有效期。

 

    d += 1.0f;//d是全局变量的引用,所以改变的值为d和全局变量f

return 0

}

6、常量变量和常量引用

把const放在引用之前表示声明的是一个常量引用。不能使用常量引用修改引用的变量的值。

eg…(1)const int b = 10;

                 int &c = b;//错误!b已经声明为常量,而c为变量,不可进行赋值。

        (2)int a = 7;

                 const int &d = a;

                 d++;//错误!d是常量引用,不能对其进行自加等操作。

即【1】对于常量类型的变量,其引用也必须是常量类型的。

    【2】对于非常量类型的变量,其引用可以是常量类型的,也可以是非常量类型的。

    【3】无论什么时候,都不能使用常量引用修改其引用的变量的值。

简单的说,小范围 = 大范围;//正确

                  大范围 = 小范围;//错误

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值