在C++中,**指针(Pointer)和引用(Reference)**是两个非常重要的概念,分别提供了不同方式来操作内存地址和数据。以下内容从概念、特点、底层原理和实现等多个角度详尽阐述。
特性 | 指针 | 引用 |
---|---|---|
定义 | 保存内存地址的变量 | 已有变量的别名 |
初始化 | 可以延后初始化,甚至指向nullptr | 必须在定义时初始化 |
指向对象的更改 | 可以更改指向的对象 | 一旦绑定到对象,就不能更改 |
空值 | 可以为空 (nullptr) | 不存在“空引用” |
算术操作 | 可以进行指针算术 | 不支持任何算术操作 |
内存地址 | 存储的是地址 | 本质是变量的地址 |
*
)访问指针指向的内存。int a = 42;
int *p = &a; // 指针p指向变量a的地址
int a = 42;
int &r = a; // 引用r绑定到变量a
#include <iostream>
void demonstratePointer() {
int a = 42;
int *p = &a; // p存储了变量a的地址
std::cout << "Value of a: " << a << "\n";
std::cout << "Address of a: " << &a << "\n";
std::cout << "Value of p: " << p << "\n";
std::cout << "Dereferenced p: " << *p << "\n";
// 改变指针指向的值
*p = 100;
std::cout << "New value of a: " << a << "\n";
}
#include <iostream>
void demonstrateReference() {
int a = 42;
int &r = a; // r是a的引用
std::cout << "Value of a: " << a << "\n";
std::cout << "Value of r: " << r << "\n";
// 改变引用值,实际上改变了a
r = 100;
std::cout << "New value of a: " << a << "\n";
}
使用Mermaid图表描述内存模型。
动态内存分配:使用new
和delete
。
int *ptr = new int(5); // 分配内存
delete ptr; // 释放内存
数组和指针:指针可以遍历数组。
int arr[] = {1, 2, 3};
int *ptr = arr;
for (int i = 0; i < 3; ++i) {
std::cout << *(ptr + i) << " ";
}
空指针检查:防止野指针。
if (ptr != nullptr) {
*ptr = 10;
}
不能重新绑定:绑定后无法指向其他变量。
int a = 5, b = 10;
int &ref = a;
// ref = &b; // 错误
不能为nullptr:引用总是有效。
特性 | 指针 | 引用 |
---|---|---|
是否需要初始化 | 可延迟初始化,也可为nullptr | 必须初始化 |
是否可重新绑定 | 可通过赋值改变指向 | 不可重新绑定 |
是否占用内存 | 占用额外的内存(存储地址) | 不额外占用内存 |
操作对象的方式 | 通过解引用访问指向的对象 | 直接操作绑定的对象 |
灵活性 | 支持动态分配、算术操作和空值 | 简单易用,但灵活性有限 |
使用场景 | 动态内存管理、复杂数据结构操作 | 参数传递和局部变量操作 |
欢迎关注、点赞、收藏!更多系列内容可以点击专栏目录订阅,感谢支持,再次祝大家祉猷并茂,顺遂无虞!
若将文章用作它处,请一定注明出处,商用请私信联系我!