《More Effective C++》《基础议题——1、指针和引用的区别》

本文详细比较了C++中的指针和引用在定义、初始化、使用和内存分配上的差异。指针更灵活,但可能引发空指针问题;引用更安全,且使用更便捷,尤其在避免空值和内存管理方面。
摘要由CSDN通过智能技术生成

1、term1:指针和引用的区别

1.1定义的角度

  • 指针:

指针是一个变量,其值为另一个变量的地址。指针变量存储的是另一个变量的内存地址,而不是该变量的值。通过使用指针,可以直接访问和修改变量的内存地址,实现更加灵活和高效的数据处理。

在C++中,指针的声明和初始化如下:

int num = 10;    // 定义一个整型变量num  
int* ptr = # // 定义一个指向整型的指针变量ptr,并将其初始化为num的地址

通过指针访问变量的值时,需要使用解引用运算符*:

std::cout << *ptr << std::endl; // 输出指针所指向的变量的值,即10

此外,还可以使用指针进行数组访问、动态内存分配等操作。指针在C++中是非常重要且灵活的工具,但也容易引发一些常见的错误,如空指针访问、野指针等。

  • 引用:

引用是C++11引入的一个新特性,它提供了一种更加安全和便捷的方式来访问和修改变量的值。引用可以被视为一个已经存在的变量的别名,一旦一个引用被初始化,它就不能被重新赋值引用其他变量。
在C++中,引用的声明和初始化如下:

int num = 10; // 定义一个整型变量num  
int& ref = num; // 定义一个整型引用ref,并将其初始化为num的引用

通过引用访问变量的值时,可以直接使用引用的名称:

std::cout << ref << std::endl; // 输出引用的值,即10  
ref = 20; // 修改变量的值,引用的值也会随之改变  
std::cout << num << std::endl; // 输出20,因为ref和num实际上是同一个变量

与指针相比,引用的语法更加简洁,也更加安全。引用的作用范围与其所引用的变量相同,因此不需要担心空引用等问题。在函数参数传递、返回值等场景中,引用可以提供更加高效和便捷的方式。

1.2初始化的角度

1.2.1 引用必须初始化,指针不必

举个栗子:

string& rs;      //error 引用必须被初始化
string s("abc");
string& rs = s;  //true rs指向了s,s被初始化

string* ps       //true 未初始化的指针,合法但是危险;
引用:代表起别名,需要指明是哪个变量的别名
指针:代表地址,可以在需要使用的时候再赋予空间地址

1.2.2 引用“专一”,指针“花心”

指针可以被重新赋值以指向一个不同的对象;但是引用则总在指向初始化时被指向的对象,以后不能被改变。
举个栗子:

string s1("Nancy");
string s2("Willian");
string& rs = s1;   //rs引用s1;
stirng& ps = &s1;  //ps指向s2;
rs = s2;           //rs依旧引用s1,不过此时s1的值改为Willian了;

ps = &s2;          //ps指向s2,ps改变了指向,但是s1的数值没有改变;
引用 ======》 绑定一个实体以后,不能再绑定其他实体;
指针 ======》 可以随时改变地址以及地址指向的内容

1.3使用的角度

1.3.1使用引用比指针更加省心

根据1.2.1的论证,不存在指向空值的引用,所以在使用前不需要测试引用的合法性;但是在使用指针之前需要对指针进行判断;
举个栗子:

void printDouble(const double & rd){
	cout << rd ;//不需要测试rd,他一定指向一个double的数值
}
void printDouble(const double* pd){
	if(pd){
	 cout << *pd ;//首先检查一下指针是否为空
	 }
}

1.3.2指针需要显示解引用,引用是编译器自己处理

举个栗子:

int Test1(int* p)
{
    *p = 10;    //解引用才能使用
}
 
int Test2(int& p)
{
    p = 10;    //可以直接使用
}

1.3.3 使用时候的分配空间问题

首先要说的是,引用的底层是用指针来做的。但是使用引用无需开辟多余的空间;但是指针引用需要通过开辟空间,来赋予空间地址。
举个栗子:

int a = 10;
int &b = a;
b = 20;   //直接修改实体a的数值;

int * p;            //一开始可以无需初始化
p = new int[10];    //分配10个int类型的空间
*p = 20;

归纳:

  • 使用指针的情况:

(1)存在不指向任何对象的可能;
(2)需要能够在不同的时刻指向不同的对象;

  • 使用引用的情况:

(1)总是指向一个对象,并且一旦指向这个对象后就不会改变指向;
(2)重载某个操作符时,应该使用引用。

2、总结

书山有路勤为径,学海无涯苦作舟。

3、参考

3.1 《More Effective C++》
3.2 初识引用 + 引用和指针的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值