在学习C++编程时,指针和引用是两个非常重要的概念。虽然它们都可以被用来访问和修改变量,但它们的工作原理和行为方式却截然不同。本文将探讨为什么通过指针传递的函数能改变原始值,而通过引用传递的函数却不能。
1. 理解指针和引用
首先,我们需要对指针和引用的基本概念进行澄清。指针是一个变量,其值为另一个变量的地址。通过指针,您可以直接访问内存中的数据。而引用是一个变量的别名,在定义的时候就绑定到了一个已有的变量,之后不能再修改。
1.1 指针的基本用法
指针的定义方式如下:
int* ptr = &originalValue;
在这个例子中,`ptr` 是一个指向 `originalValue` 的指针,使用 `*` 运算符可以访问或修改 `originalValue` 的值:

*ptr = 20; // 修改 originalValue 的值为 201.2 引用的基本用法
引用的定义非常简单:
int& ref = originalValue;
这行代码使得 `ref` 成为 `originalValue` 的引用。可以通过 `ref` 访问 `originalValue` 的值,但不能重新绑定到其他变量。
2. 指针与原始值的关系
当你将指针传递给函数时,你实际上是在传递一个地址。这样,函数体内的任何修改都会反映在原始变量上。这就是指针的直接性,使得修改原始值成为可能。
2.1 通过指针修改值的示例
下面是一个通过指针改变原始值的示例:
void modifyPointer(int* ptr) {*ptr = 30; // 直接修改了原始变量的值
}
如果你调用这个函数并传递一个指针,它会改变你传入的原始变量的值。
3. 引用与原始值的无能为力
与指针不同,当你通过引用传递变量时,你只能修改这个变量的内容,而不能改变它指向的原始变量。而且,如果你在函数内部试图重新绑定引用,将会导致编译错误。
3.1 通过引用修改值的示例
以下是一个通过引用试图修改原始值的示例:
void modifyReference(int& ref) {ref = 40; // 这将修改原始变量的内容
}
这里的代码可以修改引用所绑定的变量,但无法改变引用本身绑定的变量。如果想将它指向其他变量,编译器会报错。
4. 小结:指针与引用的选择
在决定使用指针还是引用时,需要考虑您的需求。如果您希望通过函数修改原始值,且可能需要重新绑定变量,那么选择指针更为合适;如果您只需修改变量的内容而不需重新绑定,引用则更加简洁和安全。
综上所述,通过指针可以改变原始变量的值,而引用只能用来修改指向的变量内容而不能改变原始绑定。这就是为什么`modifyPointer`能够改变原始值,而`modifyReference`却不能的原因。


