C++ 指针与引用教程
在C++中,指针和引用是两种非常强大的特性,它们允许程序直接访问和操作内存中的地址和数据。理解和掌握指针与引用对于深入理解C++的内存管理机制、提高程序效率和灵活性至关重要。以下是一篇关于C++指针与引用的基础教程。
一、指针基础
1. 指针的定义
指针是一个变量,其存储的是另一个变量的内存地址。指针的类型必须与其所指向的变量的类型相匹配。
int var = 20; | |
int* ptr = &var; // ptr 指向 var 的地址 |
int* ptr
:声明了一个指向int
类型的指针ptr
。&var
:取地址运算符,获取var
的地址。
2. 指针的解引用
解引用指针就是访问指针所指向地址的值。这通过使用*
运算符实现。
std::cout << "Value of var: " << var << std::endl; | |
std::cout << "Value at ptr: " << *ptr << std::endl; // 输出与var相同 |
3. 指针的算术运算
指针支持简单的算术运算,如加法和减法,但结果是以指针所指向类型的字节大小为单位的偏移量。
int arr[5] = {1, 2, 3, 4, 5}; | |
int* ptr = arr; | |
std::cout << *(ptr + 2) << std::endl; // 输出 3 |
4. 指针与数组
在C++中,数组名可以看作是指向数组首元素的指针。
int arr[] = {10, 20, 30}; | |
int* ptr = arr; // ptr 指向 arr[0] | |
std::cout << *(ptr + 1) << std::endl; // 输出 20 |
二、引用基础
1. 引用的定义
引用是C++的一个别名,它是另一个变量的别名。引用必须在定义时被初始化,并且一旦被绑定到一个变量,就不能再改变为另一个变量的别名。
int var = 10; | |
int& ref = var; // ref 是 var 的引用 |
2. 引用的使用
通过引用,我们可以直接访问和操作它所引用的变量。
std::cout << "Value of var: " << var << std::endl; | |
std::cout << "Value of ref: " << ref << std::endl; // 输出与var相同 | |
ref = 20; // 改变 ref 的值实际上改变了 var 的值 | |
std::cout << "New value of var: " << var << std::endl; // 输出 20 |
3. 引用与函数
引用在函数参数传递中特别有用,因为它们允许函数直接修改其参数的值,而无需使用指针和额外的解引用操作。
void modify(int& x) { | |
x = 100; | |
} | |
int main() { | |
int a = 5; | |
modify(a); | |
std::cout << "Value of a after modify: " << a << std::endl; // 输出 100 | |
return 0; | |
} |
三、指针与引用的区别
- 初始化:引用在定义时必须初始化,而指针可以在定义时不初始化(但这是一个不好的做法,因为它可能导致未定义行为)。
- 空值:指针可以指向空(
nullptr
),而引用必须总是指向某个对象。 - 多级引用:可以有多级指针(如
int** ptr
),但不允许有多级引用。 - 大小:指针的大小是固定的(通常是机器字长),而引用的大小则依赖于它所引用的类型(但实际上,编译器会处理这些细节,对程序员来说,引用通常看起来就像是一个简单的别名)。
- 语法:指针和引用在语法上有明显区别,特别是在解引用时(
*ptr
vsref
)。
结论
指针和引用是C++中两个强大而灵活的特性,它们提供了直接访问和操作内存地址的能力。理解和掌握这些概念对于编写高效、可维护的C++程序至关重要。在实际编程中,应根据具体需求和场景合理选择使用指针或引用。