参考文献:
文章目录
- C++中的指针与引用
- [1. 指针的基本概念](#1. 指针的基本概念)
- [2. 引用的基本概念](#2. 引用的基本概念)
- [3. 指针与引用的区别](#3. 指针与引用的区别)
- [4. 应用场景](#4. 应用场景)
C++中的指针与引用
在C++编程中,指针和引用是两个非常重要的概念。它们都用于间接访问变量,但在语法和语义上有显著的区别。
1. 指针的基本概念
指针是一个变量,其值是另一个变量的内存地址。指针可以用于动态内存分配、数组和字符串操作、函数参数传递等。
指针的声明和使用
指针的声明使用星号(*
)符号。以下是指针的声明和基本使用示例:
cpp
#include <iostream>
int main() {
int var = 10;
int* ptr = &var; // 指针变量,存储var的地址
std::cout << "变量 var 的值: " << var << std::endl;
std::cout << "指针 ptr 存储的地址: " << ptr << std::endl;
std::cout << "通过指针访问 var 的值: " << *ptr << std::endl;
return 0;
}
在上面的示例中,ptr
是一个指向整数的指针,它存储了变量var
的地址。通过解引用操作符(*
),我们可以访问指针所指向的变量的值。
2. 引用的基本概念
引用是一个变量的别名,它提供了一种通过不同名称访问同一变量的方式。引用在声明时必须被初始化,并且一旦绑定到一个变量,就不能再改变其绑定。
引用的声明和使用
引用的声明使用与指针相似的符号,但不需要显式的解引用操作。以下是引用的声明和使用示例:
cpp
#include <iostream>
int main() {
int var = 10;
int& ref = var; // 引用变量,ref是var的别名
std::cout << "变量 var 的值: " << var << std::endl;
std::cout << "引用 ref 的值: " << ref << std::endl;
ref = 20; // 修改引用的值, 并不是修改引用(绑定)
std::cout << "修改后,变量 var 的值: " << var << std::endl;
return 0;
}
在上面的示例中,ref
是一个引用,它绑定到变量var
。通过修改ref
的值,我们实际上修改了var
的值。
3. 指针与引用的区别
初始化
- 指针 :可以在声明后再初始化,如
p = &x
。 - 引用 :在声明时必须被初始化,
int& r = x;
。
重新绑定
- 指针:可以指向不同的变量。
- 引用:一旦绑定到一个变量,就不能再改变其绑定。
空值表示
- 指针 :可以为
null
,表示不指向任何有效对象。 - 引用 :不能为
null
,必须绑定到一个有效对象。
语法
- 指针 :需要使用
*
操作符进行解引用,如*p = 20;
- 引用 :不需要显式的解引用操作,如
r= 40;
内存占用
- 指针:本身占用一个内存单元,用于存储地址值。
- 引用 :不需要额外的内存空间,它只是原变量的别名。所以直接给引用类型赋值报错!例如:
int& ref = 10;
4. 应用场景
函数参数传递
- 指针 :适用于需要传递
null
或需要改变指针指向的场景。 - 引用:适用于需要直接操作变量而不改变其地址的场景。
cpp
#include <iostream>
void modifyPointer(int* ptr) {
if (ptr) {
*ptr = 20;
}
}
void modifyReference(int& ref) {
ref = 30;
}
int main() {
int value = 10;
modifyPointer(&value);
std::cout << " modifyPointer修改后: " << value << std::endl;
modifyReference(value);
std::cout << "modifyReference修改后: " << value << std::endl;
return 0;
}
在这个示例中,modifyPointer
函数通过指针修改变量的值,而modifyReference
函数通过引用修改变量的值。
动态内存分配
- 指针:适用于动态内存分配和释放。
- 引用:不适用于动态内存分配。
cpp
#include <iostream>
int main() {
int* ptr = new int(100); // 动态分配内存
std::cout << "动态分配的值: " << *ptr << std::endl;
delete ptr; // 释放内存
return 0;
}
在这个示例中,指针用于动态分配和释放内存,而引用无法实现这一功能。