面试题:C/C++引用和指针的区别?
C/C++中的指针(pointer)和引用(reference)都是用来处理变量间的关系和交互的工具,但是它们有一些不同点。
指针和引用的定义
指针(pointer)是一个变量,存储着另一个变量的内存地址。可以通过解除引用运算符 *
访问该内存地址所存储的值。例如:
int x = 10;
int *p = &x;
std::cout << *p << std::endl; // 输出 10
引用(reference)是一个别名,表示已存在变量的另一个名称。可以直接访问引用变量的值,并且修改引用变量会直接影响到实际变量。例如:
int x = 10;
int &r = x;
std::cout << r << std::endl; // 输出 10
指针和引用的特点
- 定义时需要指定类型:指针需要指定指向对象的类型,引用需要指向一个已有对象的类型。
- 指针可以重新赋值并指向其他对象,而引用在被初始化后就不能再指向其它的对象。
- 指针可以为空或无效(null),但是引用必须总是指向某个有效对象。
- 指针可以被比较,而引用没有比较运算符。
- 引用相当于指针的语法糖,它的声明和使用更为简便。
指针和引用的应用场景
-
指针通常用于动态内存分配、数组、字符串、函数参数传递等方面。例如:
int *p = new int[10]; char *str = "hello"; void swap(int *a, int *b);
-
引用通常用于函数参数传递、运算符重载、类成员变量等方面。例如:
void foo(int &x); class MyVector { private: double &data; public: MyVector(double &value) : data(value) {} };
总结
指针和引用都是 C/C++ 中非常重要的概念,可以方便地处理对象间的关系和交互。指针可以重新赋值并指向其他对象,具有一定灵活性,通常用于动态内存分配、数组、字符串、函数参数传递等方面;引用不能重新赋值,但是定义和使用更为简便,通常用于函数参数传递、运算符重载、类成员变量等方面。在实际开发中,需要灵活使用指针和引用,根据实际情况选择合适的方法来解决问题。