C++中指针使用详解(4)指针的高级应用汇总

C++ 中指针的高级应用非常丰富,掌握这些内容能让你写出更高性能、更底层控制力强的代码。下面是应用模块梳理和例子讲解。


目录预览

  1. 函数指针与回调机制
  2. 指针数组 vs 数组指针
  3. 指针与类成员函数(成员函数指针)
  4. 智能指针(unique_ptr, shared_ptr, weak_ptr
  5. 指针与继承、虚函数表(vtable)
  6. 指针与内存对齐、指针算术
  7. 指针类型转换(reinterpret_cast, static_cast
  8. 指针模拟多态和接口
  9. 自定义 allocator / 内存池(高级性能优化)
  10. 指针与并发(原子指针、锁自由结构)

1. 函数指针与回调机制

声明与使用

void hello() {std::cout << "Hello\n";
}void call(void (*func)()) {func(); // 调用传入的函数指针
}

也可以传入带参数的函数:

void print(int x) {std::cout << x << "\n";
}void call(void (*func)(int), int val) {func(val);
}

2. 指针数组 vs 数组指针

表达式含义
int* arr[10]数组,每个元素是 int*
int (*arr)[10]指向数组 的指针

示例

int* pArr[10];       // 10 个 int 指针
int arr[10];
int (*p)[10] = &arr; // 一个指针,指向包含 10 个 int 的数组

3. 成员函数指针

声明和调用成员函数指针:

class A {
public:void show() { std::cout << "A::show\n"; }
};void (A::*pFunc)() = &A::show;A a;
(a.*pFunc)();  // 使用成员函数指针调用

注意:成员函数指针与普通函数指针不同,它需要对象实例才能调用。


4. 智能指针(现代 C++ 的推荐方式)

std::unique_ptr

std::unique_ptr<int> p = std::make_unique<int>(10);
  • 不能拷贝,只能转移
  • 自动析构,无需手动 delete

std::shared_ptr

std::shared_ptr<int> p1 = std::make_shared<int>(20);
std::shared_ptr<int> p2 = p1;  // 引用计数 +1
  • 多个指针共享对象生命周期

std::weak_ptr

避免循环引用

std::weak_ptr<int> wp = p1;

5. 指针与虚函数表(vtable)

基类指针指向派生类(多态)

class Base {
public:virtual void foo() { std::cout << "Base\n"; }
};class Derived : public Base {
public:void foo() override { std::cout << "Derived\n"; }
};Base* b = new Derived();
b->foo(); // 输出 "Derived"

底层通过虚函数表(vtable)实现,vptr 指针指向类的虚函数表。


6. 内存对齐与指针算术

struct alignas(16) Vec4 {float x, y, z, w;
};

指针算术是按类型大小偏移的:

int* p = arr;
p += 2; // 实际偏移 sizeof(int) * 2 字节

7. 指针类型转换

int a = 10;
void* vp = &a;int* ip = static_cast<int*>(vp); // OK
float* fp = reinterpret_cast<float*>(ip); // 危险,类型错配

类型转换建议顺序:

  • static_cast:安全的编译期转换
  • reinterpret_cast位级别转换,需小心
  • const_cast:去掉 const 限定
  • dynamic_cast:用于 RTTI 下的多态类型转换(带 virtual

8. 指针模拟多态与接口

struct Interface {void (*run)(void*);void* self;
};void do_something(void* p) {std::cout << "Run on raw object\n";
}Interface iface = { do_something, nullptr };
iface.run(iface.self);
  • 类似于 C 风格接口表
  • 可用于插件系统、自定义脚本语言嵌入等

9. 自定义内存分配器(性能优化)

使用自定义 pointer allocator,跳过 malloc/new:

template <typename T>
class MyAllocator {...T* allocate(size_t n) { return static_cast<T*>(::operator new(n * sizeof(T))); }
};

结合 STL 使用:

std::vector<int, MyAllocator<int>> v;

也可做内存池管理(如用于点云、游戏对象池)


10. 指针与并发

  • std::atomic<T*> 保证多线程访问安全
  • 可用于 lock-free 数据结构
std::atomic<int*> ap;
int* p = new int(42);
ap.store(p);

高级:Hazard Pointer、ABA 问题、Compare-And-Swap(CAS)


总结脑图式表

            ┌────────────┐│ 高级指针用法│└────────────┘↓┌────────────┬────────────┬────────────┬────────────┐│ 函数指针   │ 成员指针   │ 智能指针   │ 指针算术   │├────────────┴────────────┴────────────┴────────────┤│ 内存池     │ 指针与类   │ vtable 多态│ 类型转换   │├────────────┬────────────┬────────────┬────────────┤│ ABI + 栈帧 │ 并发原子指针│ 插件接口  │ STL allocator │└────────────┴────────────┴────────────┴────────────┘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理软件imgPro—调参救星!

推荐一款图像处理软件imgPro&#xff0c;该软件是逛B站时偶然间发现&#xff0c;虽然up主是新号&#xff0c;但是视频中看起来非常实用&#xff01; 核心是多种算法高效调参&#xff0c;亮点是自动生成源码&#xff01;这您受得了吗&#xff1f;调试之后&#xff0c;直接复制代…

DOM基础学习

一、DOM文档对象模型 通常将DOM看作一颗“树”&#xff0c;DOM将整个文档看作一颗“家谱树 ” 二、对象 用户定义的对象内建对象&#xff08;Array、Date、Math&#xff09;宿主对象 三、节点 node 元素节点&#xff08;element node&#xff09;文本节点&#xff08;text…

初识人工智能、机器学习、深度学习和大模型

文章目录 1. 前言2. 相关概念3. 层级关系4. 应用场景对比4. 实际案例 初识人工智能、机器学习、深度学习和大模型 1. 前言 之前经常听人说AI、机器学习&#xff0c;深度学习之类的词汇&#xff0c;总是傻傻的不了解他们的区别&#xff0c;近来有空&#xff0c;来通俗说说个人看…

n8n系列(1)初识n8n:工作流自动化平台概述

1. 引言 随着各类自动化工具的涌现,n8n作为一款开源的工作流自动化平台,凭借其灵活性、可扩展性和强大的集成能力,正在获得越来越多技术团队的青睐。 本文作为n8n系列的开篇,将带您全面了解这个强大的自动化平台,探索其起源、特性以及与其他工具的差异,帮助您判断n8n是否…

Linux:web服务

一、nginx的安装及启用 1、为主机配置IP和搭建软件仓库 &#xff08;1&#xff09;IP的配置 &#xff08;2&#xff09;搭建软件仓库 2、 web服务的安装与启用 &#xff08;1&#xff09;nginx的端口 更改nginx端口号 效果 &#xff08;2&#xff09; 默认发布目录 修改默认发…

用卷积神经网络 (CNN) 实现 MNIST 手写数字识别

在深度学习领域&#xff0c;MNIST 手写数字识别是经典的入门级项目&#xff0c;就像编程世界里的 “Hello, World”。卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;作为处理图像数据的强大工具&#xff0c;在该任务中展现出卓越的性能。本…

从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能

从 MDM 到 Data Fabric&#xff1a;下一代数据架构如何释放 AI 潜能 —— 传统治理与新兴架构的范式变革与协同进化 引言&#xff1a;AI 规模化落地的数据困境 在人工智能技术快速发展的今天&#xff0c;企业对 AI 的期望已从 “单点实验” 转向 “规模化落地”。然而&#…

苍穹外卖部署到云服务器使用Docker

部署前端 1.创建nginx镜像 docker pull nginx 2.宿主机&#xff08;云服务器&#xff09;创建挂载目录和文件 最好手动创建 而不是通过docker run创建&#xff0c;否则nginx.conf 默认会被创建为文件夹 nginx.conf 和html可以直接从黑马给的资料里导入 3.运行nginx容器&am…

C++ 渗透 数据结构中的二叉搜索树

欢迎来到干货小仓库 "沙漠尽头必是绿洲。" --面对技术难题时&#xff0c;坚持终会看到希望。 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; a、若它的左子树不为空&#xff0c;则…

实现滑动选择器从离散型的数组中选择

1.使用原生的input 详细代码如下&#xff1a; <template><div class"slider-container"><!-- 滑动条 --><inputtype"range"v-model.number"sliderIndex":min"0":max"customValues.length - 1"step&qu…

ARM寻址方式

寻址方式指的是确定操作数位置的方式。 寻址方式&#xff1a; 立即数寻址 直接寻址&#xff08;绝对寻址&#xff09;&#xff0c;ARM不支持这种寻址方式&#xff0c;但所有CISC处理器都支持 寄存器间接寻址 3种寻址方式总结如下&#xff1a; 助记符 RTL格式 描述 ADD r0,r1…

学苑教育杂志学苑教育杂志社学苑教育编辑部2025年第9期目录

专题研究 核心素养下合作学习在初中数学中的应用 郑铁洪; 4-6 教育管理 小学班级管理应用赏识教育的策略研究 芮望; 7-9 课堂教学 小学数学概念教学的实践策略 刘淑萍; 10-12 “减负提质”下小学五年级语文课堂情境教学 王利;梁岩; 13-15 小练笔的美丽转身…

关于类型转换的细节(隐式类型转换的临时变量和理解const权限)

文章目录 前言类型转换的细节1. 类型转换的临时变量细节二&#xff1a;const与指针 前言 关于类型转换的细节&#xff0c;这里小编和大家探讨两个方面&#xff1a; 关于类型转化的临时变量的问题const关键字的权限问题 — 即修改权限。小编或通过一道例题&#xff08;配图&am…

技术对暴力的削弱

信息时代的大政治分析&#xff1a;效率对暴力的颠覆 一、工业时代勒索逻辑的终结 工厂罢工的消亡 1930年代通用汽车罢工依赖工厂的物理集中、高资本投入和流水线脆弱性&#xff0c;通过暴力瘫痪生产实现勒索。 信息时代企业分散化、资产虚拟化&#xff08;如软件公司可携带代码…

深入理解分布式锁——以Redis为例

一、分布式锁简介 1、什么是分布式锁 分布式锁是一种在分布式系统环境下&#xff0c;通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据&#xff0c;从而避免数据的不一致性。 线程锁&#xff1a; 也被称为互斥锁&#xff08…

yolo训练用的数据集的数据结构

Football Players Detection using YOLOV11 可以在roboflow上标注 Sign in to Roboflow 训练数据集只看这个data.yaml 里面是train的image地址和classnames 每个image一一对应一个label 第一个位是分类&#xff0c;0是classnames[0]对应的物体&#xff0c;现在是cuboid &…

Redis 使用及命令操作

文章目录 一、基本命令二、redis 设置键的生存时间或过期时间三、SortSet 排序集合类型操作四、查看中文五、密码设置和查看密码的方法六、关于 Redis 的 database 相关基础七、查看内存占用 一、基本命令 # 查看版本 redis-cli --version 结果&#xff1a;redis-cli 8.0.0red…

Java大师成长计划之第13天:Java中的响应式编程

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 随着现代应用程序的复杂性增加&…

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…

K8s 常用命令、对象名称缩写汇总

K8s 常用命令、对象名称缩写汇总 前言 在之前的文章中已经陆续介绍过 Kubernetes 的部分命令&#xff0c;本文将专题介绍 Kubernetes 的常用命令&#xff0c;处理日常工作基本够用了。 集群相关 1、查看集群信息 kubectl cluster-info # 输出信息Kubernetes master is run…