基于算法竞赛的c++编程(26)指针的高阶用法
指针的高阶用法(C++)
指针在C++中是一个强大的工具,除了基础的指向变量和动态内存分配外,还有许多高阶用法可以提高代码的效率和灵活性。
函数指针
函数指针允许将函数作为参数传递或存储在数据结构中,常用于回调机制和策略模式。
定义函数指针的语法:
// 定义一个指向函数的指针,该函数接受两个int参数并返回int
int (*funcPtr)(int, int);
使用示例:
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }funcPtr = add; // 指向add函数
cout << funcPtr(3, 5); // 输出8funcPtr = subtract; // 指向subtract函数
cout << funcPtr(5, 3); // 输出2
指针与多态
通过基类指针调用派生类函数是实现运行时多态的核心机制。
示例:
class Base {
public:virtual void print() { cout << "Base" << endl; }
};class Derived : public Base {
public:void print() override { cout << "Derived" << endl; }
};Base* ptr = new Derived();
ptr->print(); // 输出"Derived",多态调用
delete ptr;
智能指针
智能指针(如std::unique_ptr
和std::shared_ptr
)自动管理内存,避免内存泄漏。
std::unique_ptr
示例:
#include <memory>
std::unique_ptr<int> uptr(new int(10));
cout << *uptr; // 输出10
// 无需手动删除,超出作用域自动释放
std::shared_ptr
示例:
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
std::shared_ptr<int> sptr2 = sptr1; // 共享所有权
cout << *sptr2; // 输出20
指针与数组的灵活操作
指针可以像迭代器一样遍历数组,支持指针算术运算。
示例:
int arr[] = {1, 2, 3, 4, 5};
int* p = arr; // 指向数组首元素
for (int i = 0; i < 5; ++i) {cout << *(p + i) << " "; // 输出1 2 3 4 5
}
指向指针的指针(双指针)
双指针常用于动态二维数组或修改指针本身。
动态二维数组示例:
int** matrix = new int*[3];
for (int i = 0; i < 3; ++i) {matrix[i] = new int[4]{i, i+1, i+2, i+3};
}
// 释放内存
for (int i = 0; i < 3; ++i) {delete[] matrix[i];
}
delete[] matrix;
指针与STL算法的结合
指针可以与STL算法一起使用,例如排序普通数组。
示例:
#include <algorithm>
int data[] = {5, 2, 9, 1, 5};
std::sort(data, data + 5); // 排序数组
for (int n : data) cout << n << " "; // 输出1 2 5 5 9
类型安全的指针转换
使用static_cast
、dynamic_cast
等操作符进行类型转换。
dynamic_cast
示例(需多态类):
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 安全向下转换
if (d) {d->print(); // 输出"Derived"
}
delete b;
这些高阶用法可以显著提升C++程序的灵活性和性能,但需谨慎处理内存和类型安全。