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

基于算法竞赛的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.xdnf.cn/news/12939.html

相关文章:

  • 基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
  • VSCode 没有添加Windows右键菜单
  • Mac如何配置ZSH并使用Oh-my-zsh?让你的终端更加实用、美观
  • QT开发技术【ffmpeg EVideo录屏软件 一】
  • 多模态学习路线(2)——DL基础系列
  • 【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
  • 微服务商城-商品微服务
  • CSS标题下划线动态进入和移开
  • 【春秋云镜】CVE-2023-2130漏洞复现exp
  • 【大模型:知识库管理】--Dify接入RAGFlow 知识库
  • 生命之光-中小企实战运营和营销工作室博客
  • AI智能体终结运维“狼来了“
  • 解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
  • Java数组Arrays操作全攻略
  • 设计模式-状态模式
  • 从零手写Java版本的LSM Tree (二):KeyValue 数据结构
  • Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
  • Linux部署私有文件管理系统MinIO
  • iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
  • Spring Boot 3+:现代Java应用开发的新标杆
  • Python任务调度模型
  • python如何将word的doc另存为docx
  • [C++错误经验]case语句跳过变量初始化
  • 基于uni-app for HarmonyOS5 的跨平台组件库开发指南,以及组件示例
  • 井云科技|智能体变现新路径:从开发到盈利的关键跨越
  • 热烈祝贺埃文科技正式加入可信数据空间发展联盟
  • AI 边缘计算网关推动各行业的数字化转型和智能化升级
  • HTML 标签
  • 【MySQL基础】MySQL表操作全面指南:从创建到管理的深度解析
  • OPENCV的cvtColor和putText的讲解