C++中指针和引用的区别
在C++中,指针和引用都是用于间接访问变量的方式,但它们在底层实现和使用上有本质的区别。
一、指针
1、定义方式:
指针是一个变量,其值为另一个变量的地址,这意味着指针本身存储的是内存地址。
int var = 10; int* ptr = &var; // ptr是一个指向int类型变量的指针2、空值:
指针可以有nullptr(C++11及以后版本)或NULL(在C++98中)作为空值。
int* ptr = nullptr; // C++11及以后 // 或者 int* ptr = NULL; // C++983、可以改变指向:
指针的值(即它所指向的地址)可以在程序运行时被改变,指向另一个变量或地址。
int x = 20; ptr = &x; // ptr现在指向x4、解引用:
使用*操作符可以访问指针所指向的变量的值。
int value = *ptr; // value现在是205、用途:
指针通常用于动态内存管理(如使用new和delete),或者在需要操作地址或进行低级内存操作时使用。
二、引用
1、定义方式:
引用在定义时必须被初始化,并且一旦被初始化之后,它就一直引用那个变量,不能改变引用的目标(即不能让一个引用引用另一个变量)。
int var = 10; int& ref = var; // ref是对var的引用2、空引用:
引用不能为空,必须在定义时被初始化。
int& ref; // 错误,引用必须初始化3、不可变指向:
一旦一个变量被引用,就不能改变它引用的目标。
int x = 20; ref = x; // 错误,不能改变ref引用的目标4、使用场景:
引用主要用于函数参数传递,特别是当你想要函数修改调用者的变量但又不想复制整个对象时。它还可以增加代码的可读性,使得变量的别名更加直观。
void func(int& x) { x = x + 1; // 直接修改原变量 }三、总结
1、指针提供了灵活性,可以改变其指向的地址,适用于动态内存管理和需要底层操作的情况。
2、引用提供了不可变的别名,使得代码更加直观和易于理解,适用于参数传递以避免复制大型对象。
3、选择使用指针还是引用取决于具体的需求和上下文。
4、在实际编程中,合理地选择使用它们可以提高代码的效率和可读性。
C++ 中引用和指针的详细区别
https://blog.csdn.net/qq_40844444/article/details/145294231
C++ 指针和引用的区别
https://blog.csdn.net/qq_58271100/article/details/149727436
C++ 引用详解:引用和指针的区别;按值传递,按引用传递和按指针传递的区别
https://blog.csdn.net/pure_dreams/article/details/81217392
C++ 参数传递详解:值传递、指针传递、引用传递
https://blog.csdn.net/qq_22734027/article/details/145969095
C语言面试篇:指针和引用
https://blog.csdn.net/2503_90903957/article/details/157210099
C++ 中指针和引用的区别
https://www.runoob.com/w3cnote/cpp-difference-between-pointers-and-references.html
AtCoder Beginner Contest 361
https://blog.csdn.net/dllglvzhenfeng/article/details/144401882
AtCoder Beginner Contest ABC-361(2024.12.17)
https://blog.csdn.net/dllglvzhenfeng/article/details/144542009
AtCoder Beginner Contest 362
https://blog.csdn.net/dllglvzhenfeng/article/details/147540521
AtCoder Beginner Contest 363
https://blog.csdn.net/dllglvzhenfeng/article/details/148495117
AtCoder Beginner Contest 364
https://blog.csdn.net/dllglvzhenfeng/article/details/148495823
AtCoder Beginner Contest 365
https://blog.csdn.net/dllglvzhenfeng/article/details/148512601
AtCoder Beginner Contest 366
https://blog.csdn.net/dllglvzhenfeng/article/details/148512922
AtCoder Beginner Contest 367
https://blog.csdn.net/dllglvzhenfeng/article/details/148528928
AtCoder Beginner Contest 368
https://blog.csdn.net/dllglvzhenfeng/article/details/148529438
AtCoder Beginner Contest 369
https://blog.csdn.net/dllglvzhenfeng/article/details/148533573
AtCoder Beginner Contest 370
https://blog.csdn.net/dllglvzhenfeng/article/details/148534963
