面试题答案
一键面试引用和指针在初始化方式上的不同
- 引用:
- 引用在定义时必须初始化,且一旦初始化后,就不能再引用其他对象。
- 例如:
int num = 10; int& ref = num; // 正确,引用定义时初始化
- 如果这样写
int& ref;
是错误的,因为没有初始化。
- 指针:
- 指针定义时可以不初始化。
- 例如:
int* ptr; // 合法,指针定义但未初始化 int num = 10; ptr = # // 之后再进行赋值
- 不过,未初始化的指针是野指针,使用时可能导致未定义行为,所以通常也建议尽早初始化。
在简单函数参数传递场景下,使用引用和指针初始化的代码实现及效果差异
- 使用引用传递参数:
- 代码示例:
#include <iostream> void incrementByReference(int& value) { value++; } int main() { int num = 5; incrementByReference(num); std::cout << "Value after increment by reference: " << num << std::endl; return 0; }
- 效果:在
incrementByReference
函数中,对value
的修改直接作用于传入的实参num
。因为引用是实参的别名,它们共享同一块内存空间。所以输出为Value after increment by reference: 6
。
- 使用指针传递参数:
- 代码示例:
#include <iostream> void incrementByPointer(int* value) { if (value!= nullptr) { (*value)++; } } int main() { int num = 5; incrementByPointer(&num); std::cout << "Value after increment by pointer: " << num << std::endl; return 0; }
- 效果:在
incrementByPointer
函数中,通过解引用指针value
来修改其所指向的内存中的值,从而实现对实参num
的修改。同样输出Value after increment by pointer: 6
。 - 差异:从功能上看,在这种简单的参数传递修改值场景下,两者都能达到修改实参的目的。但引用语法更简洁,且引用不能为空(初始化后就绑定到具体对象),而指针可以为空,所以在使用指针时需要额外检查是否为空指针以避免空指针解引用的错误。