C++中的數組

在C++中,數組是存儲固定大小同類型元素的連續內存塊。它是最基礎的數據結構之一,廣泛用于各種場景。以下是關于數組的詳細介紹:

一、一維數組

1. 定義與初始化
  • 語法類型 數組名[元素個數];
  • 示例
    int arr[5];  // 定義包含5個整數的數組
    arr[0] = 10;  // 賦值
    arr[1] = 20;// 初始化列表
    int arr2[5] = {1, 2, 3, 4, 5};  // 完整初始化
    int arr3[] = {10, 20, 30};      // 自動推導長度為3
    int arr4[5] = {1, 2};           // 部分初始化,剩余元素為0
    
2. 訪問與遍歷
  • 下標訪問:索引從0開始,范圍為0長度-1
    int value = arr[2];  // 訪問第3個元素
    arr[3] = 40;         // 修改第4個元素
    
  • 遍歷方式
    // 傳統for循環
    for (int i = 0; i < 5; i++) {cout << arr[i] << " ";
    }// 范圍for循環(C++11起)
    for (int num : arr) {cout << num << " ";
    }
    

二、多維數組

1. 二維數組
  • 定義類型 數組名[行數][列數];
  • 示例
    int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
    };// 訪問元素
    int value = matrix[1][2];  // 第二行第三列(值為6)
    
2. 多維數組內存布局
  • 連續存儲:多維數組在內存中按行優先(Row-major)存儲,例如:
    int arr[2][2] = {{1, 2}, {3, 4}};
    // 內存布局:1, 2, 3, 4
    

三、數組與指針

1. 數組名隱式轉換為指針
  • 數組名在多數表達式中會隱式轉換為指向首元素的指針:
    int arr[5] = {1, 2, 3, 4, 5};
    int* ptr = arr;  // 等價于 &arr[0]// 通過指針訪問數組
    cout << *ptr;    // 輸出1
    cout << *(ptr+2);  // 輸出3(等價于 arr[2])
    
2. 指針算術
  • 指針加減運算基于元素類型大小:
    int* p = arr;
    p++;  // 指針移動4字節(int類型大小)
    
3. 動態數組(使用指針)
  • 堆上分配:使用newdelete[]
    int size = 10;
    int* dynamicArr = new int[size];  // 動態分配數組// 使用數組
    for (int i = 0; i < size; i++) {dynamicArr[i] = i;
    }delete[] dynamicArr;  // 釋放內存
    

四、數組作為函數參數

1. 數組退化問題
  • 數組作為參數時會退化為指針,丟失大小信息:
    void printArray(int arr[]) {  // 等價于 int* arr// sizeof(arr) 返回指針大小(如8字節),非數組大小
    }
    
2. 正確傳遞數組的方法
  • 顯式傳遞大小
    void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {cout << arr[i] << " ";}
    }
    
  • 使用引用:保留數組大小信息:
    void printArray(int (&arr)[5]) {  // 僅接受長度為5的數組for (int num : arr) {cout << num << " ";}
    }
    
  • 使用模板:自動推導大小:
    template <size_t N>
    void printArray(int (&arr)[N]) {for (int num : arr) {cout << num << " ";}
    }
    

五、C++標準庫替代方案

1. std::array(C++11起)
  • 特點:固定大小數組,封裝在類中,提供更安全的接口。
  • 示例
    #include <array>std::array<int, 5> arr = {1, 2, 3, 4, 5};// 安全特性
    cout << arr.size();  // 返回5
    // arr[10] = 0;  // 越界訪問(運行時可能崩潰)
    arr.at(10) = 0;  // 越界訪問(拋出std::out_of_range異常)
    
2. std::vector
  • 特點:動態數組,支持自動擴容。
  • 示例
    #include <vector>std::vector<int> vec = {1, 2, 3};
    vec.push_back(4);  // 動態添加元素
    cout << vec.size();  // 返回4
    

六、常見陷阱與最佳實踐

1. 數組越界訪問
  • 問題:訪問超出數組邊界的元素,導致未定義行為。
  • 示例
    int arr[3] = {1, 2, 3};
    cout << arr[3];  // 越界訪問,可能崩潰或讀取隨機值
    
2. 內存泄漏(動態數組)
  • 問題:忘記釋放new分配的內存。
  • 解決方案:優先使用std::vector或智能指針:
    #include <memory>// 使用智能指針管理動態數組
    std::unique_ptr<int[]> arr(new int[10]);
    
3. 避免C風格數組
  • 建議:優先使用std::arraystd::vector替代原始數組,減少手動內存管理:
    // 推薦寫法
    std::array<int, 5> arr;  // 固定大小
    std::vector<int> vec;    // 動態大小
    

通過合理使用數組和標準庫容器,你能高效處理各種數據存儲需求。建議優先使用std::vectorstd::array,僅在性能敏感或與C代碼交互時使用原始數組。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84123.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

three.js 零基礎到入門

three.js 零基礎到入門 什么是 three.js為什么使用 three.js使用 Three.js1. 創建場景示例 2.創建相機3. 創建立方體并添加網格地面示例 5. 創建渲染器示例 6. 添加效果(移動/霧/相機跟隨物體/背景)自動旋轉示例效果 相機自動旋轉示例 展示效果 實現由遠到近的霧示例展示效果 T…

Elasticsearch的寫入性能優化

優化Elasticsearch的寫入性能需要從多維度入手,包括集群配置、索引設計、數據處理流程和硬件資源等。以下是一些關鍵優化策略和最佳實踐: 一、索引配置優化 合理設置分片數與副本數分片數(Shards):過少會導致寫入瓶頸(無法并行),過多會增加集群管理開銷。公式參考:分…

FMC STM32H7 SDRAM

如何無痛使用片外SDRAM? stm32 已經成功初始化了 STM32H7 上的外部 SDRAM&#xff08;32MB&#xff09; 如何在開發中無痛使用SDRAM 使它像普通 RAM 一樣“自然地”使用? [todo] 重要 MMT(Memory Management Tool) of STM32CubeMx The Memory Management Tool (MMT) disp…

【AIGC】RAGAS評估原理及實踐

【AIGC】RAGAS評估原理及實踐 &#xff08;1&#xff09;準備評估數據集&#xff08;2&#xff09;開始評估2.1 加載數據集2.2 評估忠實性2.3 評估答案相關性2.4 上下文精度2.5 上下文召回率2.6 計算上下文實體召回率 RAGas&#xff08;RAG Assessment)RAG 評估的縮寫&#xff…

VuePress完美整合Toast消息提示

VuePress 整合 Vue-Toastification 插件筆記 記錄如何在 VuePress 項目中整合使用 vue-toastification 插件&#xff0c;實現優雅的消息提示。 一、安裝依賴 npm install vue-toastification或者使用 yarn&#xff1a; yarn add vue-toastification二、配置 VuePress 客戶端增…

C#學習12——預處理

一、預處理指令&#xff1a; 解釋&#xff1a;是在編譯前由預處理器執行的命令&#xff0c;用于控制編譯過程。這些命令以 # 開頭&#xff0c;每行只能有一個預處理指令&#xff0c;且不能包含在方法或類中。 個人理解&#xff1a;就是游戲里面的備戰階段&#xff08;不同對局…

開疆智能Profinet轉Profibus網關連接CMDF5-8ADe分布式IO配置案例

本案例是客戶通過開疆智能研發的Profinet轉Profibus網關將PLC的Profinet協議數據轉換成IO使用的Profibus協議&#xff0c;操作步驟如下。 配置過程&#xff1a; Profinet一側設置 1. 打開西門子組態軟件進行組態&#xff0c;導入網關在Profinet一側的GSD文件。 2. 新建項目并…

(三)Linux性能優化-CPU-CPU 使用率

CPU使用率 user&#xff08;通常縮寫為 us&#xff09;&#xff0c;代表用戶態 CPU 時間。注意&#xff0c;它不包括下面的 nice 時間&#xff0c;但包括了 guest 時間。nice&#xff08;通常縮寫為 ni&#xff09;&#xff0c;代表低優先級用戶態 CPU 時間&#xff0c;也就是進…

Digital IC Design Flow

Flow介紹 1.設計規格 架構師根據市場需求制作算法模型(Algorithm emulation)及芯片架構(Chip architecture),確定芯片設計規格書(Chip design specification) 原型驗證 原型驗證(Prototype Validation)通常位于產品開發流程的前期階段,主要是在設計和開發的初步階…

算法打卡第18天

從中序與后序遍歷序列構造二叉樹 (力扣106題) 給定兩個整數數組 inorder 和 postorder &#xff0c;其中 inorder 是二叉樹的中序遍歷&#xff0c; postorder 是同一棵樹的后序遍歷&#xff0c;請你構造并返回這顆 二叉樹 。 示例 1: 輸入&#xff1a;inorder [9,3,15,20,7…

LangChain工具集成實戰:構建智能問答系統完整指南

導讀&#xff1a;在人工智能快速發展的今天&#xff0c;如何構建一個既能理解自然語言又能調用外部工具的智能問答系統&#xff0c;成為許多開發者面臨的核心挑戰。本文將為您提供一套完整的解決方案&#xff0c;從LangChain內置工具包的基礎架構到復雜系統的工程實踐。 文章深…

P3156 【深基15.例1】詢問學號

P3156 【深基15.例1】詢問學號 - 洛谷 數據結構-線性表 #include<bits/stdc.h> using namespace std; int n,m,a[2000005]; int main(){cin>>n>>m;for(int i1;i<n;i)cin>>a[i];//使用數組模擬線性表while(m--){int k;cin>>k;cout<<a[…

衡量嵌入向量的相似性的方法

衡量嵌入向量的相似性的方法 一、常見相似性計算方法對比 方法核心原理公式優點缺點適用場景余弦相似度計算向量夾角的余弦值,衡量方向相似性,與向量長度無關。$\text{cos}\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a}\mathbf{b}歐氏距離計算向量空間中的直線距離…

小番茄C盤清理:專業高效的電腦磁盤清理工具

在使用電腦的過程中&#xff0c;我們常常會遇到系統盤空間不足、磁盤碎片過多、垃圾文件堆積等問題&#xff0c;這些問題不僅會導致電腦運行緩慢&#xff0c;還可能引發系統崩潰。為了解決這些問題&#xff0c;小番茄C盤清理應運而生。它是一款專業的C盤清理軟件&#xff0c;能…

【版本控制】Git 和 GitHub 入門教程

目錄 0 引言1 Git與GitHub的誕生1.1 Git&#xff1a;Linus的“兩周奇跡”&#xff0c;拯救Linux內核1.2 GitHub&#xff1a;為Git插上協作的翅膀1.3 協同進化&#xff1a;從工具到生態的質變1.4 關鍵歷程時間軸&#xff08;2005–2008&#xff09; 2 Git與GitHub入門指南2.1 Gi…

Dify源碼教程:賬戶和密碼傳遞分析

概述 Dify系統中賬戶創建過程中的密碼處理是Web應用安全的重要環節。本教程詳細分析了從前端表單到后端存儲的完整流程&#xff0c;展示了Dify如何安全地處理用戶憑據。 前端部分 在 dify/web/app/install/installForm.tsx 文件中&#xff0c;當用戶填寫完表單并點擊安裝按鈕…

window查看SVN賬號密碼

背景 公司的SVN地址發生遷移&#xff0c;想遷移一下本地SVN地址&#xff0c;后來發現SVN賬號密碼忘記了。寫此文章純記錄。 遷移SVN地址&#xff1a; 找到svn目錄點擊relocate&#xff0c;輸入新的svn地址&#xff0c;如需輸入賬號密碼&#xff0c;輸入賬號密碼即完成svn地址…

Read View在MVCC里如何工作

Read View的結構 Read View中有四個重要的字段&#xff1a; m_ids&#xff1a;創建 Read View 時&#xff0c;數據庫中啟動但未提交的「活躍事務」的事務 id 列表 。min_trx_id&#xff1a;創建 Read View 時&#xff0c;「活躍事務」中事務 id 最小的值&#xff0c;即 m_ids …

如何在mac上安裝podman

安裝 Podman 在 macOS 上 在 macOS 上安裝 Podman 需要使用 Podman 的桌面客戶端工具 Podman Desktop 或通過 Homebrew 安裝命令行工具。 使用 Homebrew 安裝 Podman&#xff1a; (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…

QGraphicsView中鼠標點擊與移動事件傳遞給MainWindow

在Qt圖形應用程序開發中,QGraphicsView和QGraphicsScene框架提供了強大的2D圖形顯示功能。然而,當我們需要在主窗口(MainWindow)中處理這些視圖中的鼠標事件。 問題背景 在典型的Qt圖形應用程序架構中: MainWindow └── QGraphicsView└── QGraphicsScene└── QGra…