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.pswp.cn/diannao/81916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81916.shtml
英文地址,請注明出處:http://en.pswp.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…