指针和引用哪个好?
写C++代码时,经常遇到需要传递变量地址的情况。这时候就会纠结:到底该用指针还是引用?网上说法五花八门,有人说引用更安全,有人说指针更灵活。其实没有绝对的好坏,关键看你在什么场景下用。
从语法上看,引用更简洁
比如你要写一个交换两个数的函数,用引用写起来特别直观:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}调用的时候就跟操作普通变量一样:
int x = 3, y = 5;
swap(x, y);不用取地址,也不用解引用,代码看起来干净利落。这在写类成员函数、重载操作符时特别舒服,像是给对象“本身”做操作。
但指针能做的事情更多
指针的灵活性是引用比不了的。比如你可以让指针指向不同的对象,可以为nullptr,还能数组遍历:
int arr[5] = {1,2,3,4,5};
int* p = arr;
for (int i = 0; i < 5; ++i) {
cout << *p << endl;
++p;
}引用一旦绑定就无法更改指向,也不能指向空。你想让一个引用先绑A再绑B?不行。但指针可以随意切换目标,这在动态内存管理、链表操作里太常见了。
实际开发中怎么选?
如果你只是想修改函数外的变量值,或者避免大对象拷贝,用引用更合适。它语法简单,不容易出错,也明确表达了“这个参数是用来输入输出的”意图。
但当你处理动态分配的内存、实现数据结构(比如树、图)、需要判断是否为空等情况时,指针几乎是唯一选择。像Windows驱动开发里,大量API返回的是指针,你没法绕开。
还有一个细节:STL容器里的迭代器本质是指针的抽象,智能指针(unique_ptr、shared_ptr)也是基于指针封装的。现代C++虽然提倡多用引用,但底层依然离不开指针。
别拿偏见当标准
有人觉得“引用更现代”,于是不管啥都强行用引用,结果遇到必须换目标的情况就卡住。也有人觉得“指针才是真本事”,连简单的函数参数都要传指针,搞得代码满屏*和&,别人读着累。
真正的好代码不是非黑即白。该用引用时简洁明了,该用指针时干脆利落。就像螺丝刀和扳手,你说哪个好?得看拧的是螺钉还是螺母。