引用和指针

  • 引用的概念及用法

引用:就是给一个变量起个别名。
语法 : 定义的格式为: 类型 &引用变量名 = 已定义过的变量名;

int a=10;
int &b=a;

这里b就是a的别名
引用的特点:
1. 一个变量可取多个别名
2. 引用必须初始化
3. 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。

注意:

若被指定的值是个常变量,则引用过程中为保证值不被改变必须加const,如:
const int a=10;
const int &b=a;
const int &c=100;//成立
简单记住一个原则,范围可以由大变小,但不能由小被放大

扩展:

int i=0; double d=1.111; i=d;//隐式类型转换—-相近类型//会丢失数据
int* p=(int*)i;//成立
const &j=d;//成立
原因:

这里写图片描述

  • 引用做参数

1、完成值的交换(改变函数内部的值)和指针效果一样

void swap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 0, b = 1;
swap(a, b);
printf(“%d %d “, a, b);
system(“pause”);
return 0;

}

2、直接传值的话又要开辟空间,若值过大,浪费空间,使用指针和引用都可以解决这个问题。
typedef struct Big
{
int a[10000];
}Big;
void Read(const Big& b )
{
b.a;
}
int main()
{
Big big;
Read(big);
system("pause");
return 0;
}

引用做返回值
引用做返回值(出了当前作用域这个对象还在)(静态的或全局的)在函数运行的过程中,在主函数中会开辟一块返回值所存在的空间,在这个函数内部空间通过return语句将值直接传到这块地址中,这个过程中有个临时变量eax,所以接受时也必须加const。(语法上没有开辟空间,只是起了个别名,实际上底层实现和指针一样开辟了空间)

int Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{/*
Big big;
Read(big);*/
const int& ret = Add(1, 2);
printf(“%d\n”,ret);
system(“pause”);
return 0;
}

  • 汇编层看引用的特性
    这里写图片描述
    这里写图片描述

  • 引用和指针的区别

1、引用不可以为空,但指针可以为空。 使用指针之前必须做判空操作,而引用就不必。
2、引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节。
3、引用比指针使用起来形式上更漂亮,使用引用指向的内容时可以之间用引用变量名,而不像指针一样要使用*;定义引用的时候也不用像指针一样使用&取址。
4、引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const
指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
总而言之,言而总之——它们的这些差别都可以归结为”指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。”
>
★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

●指针是一个实体,而引用仅是个别名;

●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有
的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)

●引用不能为空,指针可以为空;

●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

●指针和引用的自增(++)运算意义不一样;

●引用是类型安全的,而指针不是 (引用比指针多了类型检查

<think>嗯,用户想了解C++引用指针的区别以及它们的应用场景。首先,我需要回忆一下这两者的基本概念。引用是变量的别名,而指针存储的是变量的地址。从之前的资料来看,引用必须在初始化时绑定到一个实体,之后不能更改,而指针可以重新指向其他变量。另外,引用不能为空,指针可以为NULL。 接下来,我需要整理它们的区别。根据引用[2][5],区别包括初始化要求、是否可为空、操作上的不同,比如指针可以算术运算而引用不行。还有引用的安全性更高,因为不能为空更容易出现野指针的情况。 应用场景方面,引用常用于函数参数传递,尤其是需要修改实参或者传递大对象时,提高效率。而指针适合需要动态内存分配、可选参数或者需要重新指向不同对象的情况。比如链表、树结构通常用指针,而函数参数传递用引用。 要注意用户可能混淆两者的语法使用方式,比如引用不需要解引用,而指针需要。此外,引用的返回需要注意生命周期,不能返回局部变量的引用,这点在引用[4]中提到过。 可能用户还想知道什么时候该用哪个,所以需要给出明确的场景对比。比如函数参数传递优先用引用,操作数据结构时用指针。同时,性能方面引用可能更高效,但指针更灵活。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能差异、如何选择、常见错误等。这样能帮助他们深入理解。</think>### C++ 引用指针的区别及应用场景 #### 一、核心区别 1. **初始化要求** - **引用**:必须在定义时初始化,且无法重新绑定到其他实体[^5]。例如: ```cpp int a = 10; int& ra = a; // 正确,引用必须初始化 ``` - **指针**:允许定义时不初始化,后续可修改指向(但建议初始化以避免野指针)[^4]。 2. **空值合法性** - **引用**:不能为 `NULL`,必须指向有效对象。 - **指针**:可以指向 `NULL` 或空地址,例如: ```cpp int* p = nullptr; // 合法 ``` 3. **内存操作** - **指针**:支持算术运算(如 `p++`)显式解引用(`*p`)[^3]。 - **引用**:直接操作目标变量,无解引用语法,例如: ```cpp ra = 20; // 直接修改 a 的值 ``` 4. **内存占用** - **指针**:占用独立内存空间(通常 4/8 字节)[^2]。 - **引用**:语法层面是别名,与目标共享内存地址,无额外空间[^2]。 #### 二、应用场景 1. **引用的典型用途** - **函数参数传递**:避免拷贝大型对象,提升效率[^2]。 ```cpp void swap(int& a, int& b) { // 引用传参 int tmp = a; a = b; b = tmp; } ``` - **返回值优化**:返回引用可避免临时对象的复制(需确保返回值生命周期足够)[^4]。 2. **指针的典型用途** - **动态内存管理**:操作堆内存(如 `new`/`delete`)[^1]。 ```cpp int* arr = new int[100]; delete[] arr; ``` - **可选参数传递**:使用 `nullptr` 表示参数缺失。 - **数据结构实现**:如链表、树的节点连接。 ```cpp struct Node { int data; Node* next; // 指针实现链表 }; ``` #### 三、安全性对比 - **引用更安全**:因不可为空且无法重绑定,减少了野指针风险。 - **指针更灵活**:支持动态操作,但需手动管理内存,易引发内存泄漏或越界问题。 #### 四、总结表格 | **特性** | **引用** | **指针** | |------------------|-----------------------------|-----------------------------| | 初始化要求 | 必须初始化 | 允许未初始化(不建议) | | 空值合法性 | 不能为 `NULL` | 可为 `nullptr` | | 重绑定 | 不可 | 可重新指向其他地址 | | 内存操作 | 直接操作目标变量 | 需解引用(`*p`) | | 应用场景 | 函数参数、返回值优化 | 动态内存、数据结构、可选参数 | --- §§ 1. 引用作为函数返回值时需要注意哪些问题? 2. 如何避免指针导致的野指针问题? 3. 在C++中,为什么优先选择引用而非指针传递参数? 4. 指针引用在底层实现上有何异同? 5. 引用能否完全替代指针?为什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值