C++ 基础入门——引用(别名)

本文详细介绍了C++中的引用与指针的区别,包括定义、特点、使用场景和安全性。引用作为变量的别名,不需内存分配,不可为空且在定义时必须初始化。指针则存储地址,可为空,需要判空处理。引用在函数参数传递中提供了一种更安全的方式,避免了空指针问题。此外,还展示了引用与指针在数组和指针上的应用。
摘要由CSDN通过智能技术生成

引用

引用的定义
类型&引用变量名称=变量名称
这就是引用变量的定义。&和类型结合称之为引用符号,不是取地址的符,代表别名的意思。

int main()
{
    int a=10;
    int b=a;   //变量
    int &c=a;  //引用//c11中成为左值引用
    return 0;
}

引用的特点

int main()
{
    int a=10;
    int &x;   //error 定义引用必须初始化
    int &y=NULL;  //error没有空引用
    int &b=a;
    int &&c=b;    //error//没有引用的引用、作为二级引用
}

Const引用

int main()
{
    int a=10;
    const int b=20;
    int &x=b;  //error
    const int &x=b; //ok;
    const int &y=a; //ok;
    const int &z=10; //ok;
    return 0;
}
//为了安全
xonst int &x=b;
// int tmp=b;
//const int &x=b;
const int &z=10;
// int tmp=10;
// const int &z=tmp;

引用作为形参替代指针

使用指针交换两个整型值
void my_swap(int *ap,int *bp)
{
    assert(ap!=NULL&&bp!=NULL);
    int tmp=*ap;
    *ap=*bp;
    *bp=tmp;
}
int main()
{
    int a=10,b=20;
    cout<<"a="<<a<<"b="<<b<<end;
    my_swap(&a,&b);
    cout<<"a="<<a<<"b="<<b<<end;
    return 0;
}
使用引用交换两个整型值
void my_swap(int &x,int &y)//不存在NULL引用,不需要判空,比指针安全
{
    int tmp=x;
    x=y;
    y=tmp;
}
int main()
{
    int a=10,b=20;
    cout<<"a="<<a<<"b="<<b<<end;
    my_swap(a,b);
    cout<<"a="<<a<<"b="<<b<<end;
    return 0;
}

其他引用形式

int main()
{
    int a=10,b=20;
    int ar[5]={1,2,3,4,5}int *p=&a;
    int *&rp=p;     //引用指针
    int &x=ar[0];
    int (&br)[5]=ar;//引用数组
    return 0;
}

指针与引用有什么区别?

1.从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;引用是某个实例的别名;
2.程序为指针变量分配内存区域;而不为引用分配内存区域;
3.解引用是指针使用时要在前加“*”;引用可以直接使用;
4.指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他实例的引用);
5.指针变量的值可以为空(NULL,nullptr);没有空引用;
6.指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空;
7.对指针变量使用“sizeof”得到的是指针变量的大小。对引用变量使用“sizeof”得到的是变量的大小。
8.理论上指针的级数没有限制;但引用只有一级,即不存在引用的引用,但可以有指针的指针。
9.++引用与++指针的效果不一样;例如就++操作而言,对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址;而不是改变所指实体(变量或对象)的内容。
对引用的操作直接反应到所引用的实体(变量或对象);
10.不可以对函数中的局部变量或对象以引用或指针方式返回。

int * func_1()
{
    int a=10;
    return &a;
}
int &func_2()
{
    int a=10;
    return a;
}
//都是错误的
从汇编层次理解引用与指针变量的区别
//原码
int main()
{
    int a=10;
    int* ip=&a;
    int &b=a;
    *ip=100;
    b=200;
    return 0;
}
分析效率
struct student
{
    char s_id[20];
    chanr s_name[20];
    char s_sex[8];
    int s_age;
};

void funa(struct student sx)
{
}
void funb(struct student *ps)
{
}
void func(struct student& st)
{
}
int main()
{
    struct student s1={};
    funa(s1);
    funb(&s1);
    func(s1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值