当前位置: 首页 > news >正文

基于算法竞赛的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_ptrstd::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_castdynamic_cast等操作符进行类型转换。
dynamic_cast示例(需多态类):

Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 安全向下转换
if (d) {d->print(); // 输出"Derived"
}
delete b;

这些高阶用法可以显著提升C++程序的灵活性和性能,但需谨慎处理内存和类型安全。

http://www.dtcms.com/a/240272.html

相关文章:

  • DeepSeek越强,Kimi越慌?
  • FTP下载Argo数据
  • 基于UniApp开发HarmonyOS 5.0鸿蒙汽车应用的指南
  • 新基建浪潮下:中国新能源汽车充电桩智慧化建设与管理实践
  • Linux 关键目录解析:底层机制与技术细节
  • 触发DMA传输错误中断问题排查
  • JS红宝书笔记 - 3.3 变量
  • 计算机网络自定向下:第二章复习
  • 多面体模型-学习笔记2
  • Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
  • 全链游戏模式:自治世界与AI增强型交互
  • Unity UGUI Button事件流程
  • 2025.6.9总结(利与弊)
  • ADS-B态势显示 ASD-View
  • GPIO(通用输入输出)与LPUART(低功耗通用异步收发传输器)简述
  • 【案例篇】为什么设置了 ulimit 但 nofile 限制仍不生效?
  • SpringCloudGateway 自定义局部过滤器
  • Android屏幕刷新率与FPS(Frames Per Second) 120hz
  • 博科Brocade FC交换机常用操作命令
  • 具身智能之人形机器人核心零部件介绍
  • 本地部署drawDB结合内网穿透技术实现数据库远程管控方案
  • 判断是否是润年
  • 从0开始学习R语言--Day20--Wilcoxon秩和检验
  • 企业如何一键复制 DolphinScheduler 项目到新项目服务器?全套自动化方案来了!(企业不外传的实用工具)
  • Python网页自动化Selenium中文文档
  • 走进离线语音:安信可 VC‑01 智能模块全面拆解与 MCU 实战
  • 爬虫基础学习day2
  • Electron简介(附电子书学习资料)
  • day030-Shell自动化编程-函数
  • Electron 防脱壳转二进制 JSC 打包过程以及踩坑记录