文章目录
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 初识引用 + 引用和指针的区别