C++的引用语法

(一)
a,引用的语法概念:Type &name = var;

b,引用的意义:
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性
例:

void myswap2(int *a, int *b)    //C语言利用指针间接赋值//可以交换
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}
void myswap3(int &a, int &b)    //C++语言中的引用//可以交换
{

    int c = 0;
    c = a;
    a = b;
    b = c;
}

c,引用的本质:
1)引用在C++中的内部实现是一个常指针
Type& name Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏。例:

void modifyA1(int &a1)
{
    a1 = 300;
}
void modifyA2(int * const a1)
{
    *a1 = 200;
}

这两个是等效的函数 ,只不过调用使用了引用的函数不用手工取地址,C++内部会自动取地址,但是使用指针的函数,需要我们手动取地址。

(二),引用的运用:
a,普通运用:

void main()
{
    int a = 10;
        int &b = a;//引用语法

    b = 100;    //相当于把a改成100

    printf("b:%d \n", b);
    printf("a:%d \n", a);
    system("pause");
}

注意点:
1:普通引用必须依附于变量 即必须初始化,如:

void main()
{
    int a = 10;
    int &b = a;
    int &c;//这句报错,普通引用必须依附于变量 即必须初始化
    system("pause");
}

2:引用做函数参数可以不初始化,

3:引用变量占内存。

b,指针引用,

#include <iostream>

using namespace std;

struct Teacher
{
    char name[64];
    int age;
};
//在被调用函数 获取资源

int getTeacher(Teacher **p)
{
    Teacher *tmp = NULL;
    if (p == NULL)
    {
        return -1;
    }
    tmp = (Teacher *)malloc(sizeof(Teacher));
    if (tmp == NULL)
    {
        return -2;
    }
    tmp->age = 33;
    //p是实参的地址  *实参的地址  去间接修改实参的值
    *p = tmp;
}

//指针引用
int getTeacher2(Teacher * &tmp)
{
    tmp = (Teacher *)malloc(sizeof(Teacher));
    if (tmp == NULL)
    {
        return -1;
    }
    tmp->age = 36;
}

void FreeTeacher(Teacher *pT1)
{
    if (pT1 == NULL)
    {
        return;
    }
    free(pT1);
}

void main()
{
    Teacher *pT1 = NULL;
//  getTeacher(&pT1);
    getTeacher2(pT1);
    cout << "age:" << pT1->age << endl;
    FreeTeacher(pT1);
    system("pause");
}

c,常引用
实例运用1
int x = 20;
const int &y = x;   //常引用是让变量引用只读属性  不能通过y去修改x了
//y = 20;//报错  不能修改

实例运用2:

void printTeacher(const Teacher &myt)
{
//常引用让实参变量拥有只读属性
printf(“myt.age:%d”, myt.age);
//myt.age = 40; //不能修改
}

void main()
{
Teacher t1;
t1.age = 36;
printTeacher(t1);

system("pause");

}


常引用的两种初始化方式:
1:

{
int x1 = 30;
const int &y1 = x1; //用x1变量去初始化常引用
}


2:

//2用字面量 初始化常量引用
{
const int a = 10; //C++编译器把a放在符号表中
//int &m = 41; //41没有内存,所以无法引用
//引用就是给内存取别名
const int &m = 43; //正确的初始化方式
//c++编译器 会为m分配内存空间
}
“`

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值