C++ 獲取數組大小、多維數組操作詳解

来源:https://www.cnblogs.com/xiaowange/p/18127353
-Advertisement-
Play Games

獲取數組的大小 要獲取數組的大小,可以使用 sizeof() 運算符: 示例 int myNumbers[5] = {10, 20, 30, 40, 50}; cout << sizeof(myNumbers); 結果: 20 為什麼結果顯示為 20 而不是 5,當數組包含 5 個元素時? 這是因為 ...


獲取數組的大小

要獲取數組的大小,可以使用 sizeof() 運算符:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
cout << sizeof(myNumbers);

結果:

20

為什麼結果顯示為 20 而不是 5,當數組包含 5 個元素時?

這是因為 sizeof() 運算符返回類型的大小(以位元組為單位)。

要找出數組有多少個元素,必須將數組的大小除以它包含的數據類型的大小:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
int getArrayLength = sizeof(myNumbers) / sizeof(int);
cout << getArrayLength;

結果:

5

使用 sizeof() 迴圈遍曆數組

然而,通過使用上面示例中的 sizeof() 方法,現在我們可以創建適用於任何大小數組的迴圈,這更加可持續。

與其寫:

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
  cout << myNumbers[i] << "\n";
}

最好寫成:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < sizeof(myNumbers) / sizeof(int); i++) {
  cout << myNumbers[i] << "\n";
}

請註意,在 C++ 版本 11(2011)中,還可以使用“for-each”迴圈:

示例

int myNumbers[5] = {10, 20, 30, 40, 50};
for (int i : myNumbers) {
  cout << i << "\n";
}

瞭解不同的數組迴圈方式是很重要的,因為你可能在不同的程式中都會遇到它們。

多維數組

多維數組是數組的數組。

要聲明一個多維數組,請定義變數類型,指定數組名稱,後跟方括弧,指定主數組有多少元素,然後再跟另一組方括弧,表示子數組有多少元素:

string letters[2][4];

與普通數組一樣,你可以使用數組文字 - 在花括弧內部的逗號分隔列表。在多維數組中,數組文字中的每個元素都是另一個數組文字。

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

數組聲明中的每組方括弧都會向數組添加另一個維度。像上面的數組被稱為具有兩個維度的數組。

數組可以具有任意數量的維度。數組的維度越多,代碼就越複雜。以下數組具有三個維度:

string letters[2][2][2] = {
  {
    { "A", "B" },
    { "C", "D" }
  },
  {
    { "E", "F" },
    { "G", "H" }
  }
};

訪問多維數組的元素

要訪問多維數組的元素,請在數組的每個維度中指定索引號。

此語句訪問 letters 數組中第一行(0)和第三列(2)的元素的值。

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

cout << letters[0][2];  // 輸出 "C"

記住:數組索引從 0 開始:[0] 是第一個元素。[1] 是第二個元素,依此類推。

更改多維數組中的元素

要更改元素的值,請引用每個維度中元素的索引號:

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};
letters[0][0] = "Z";

cout << letters[0][0];  // 現在輸出 "Z" 而不是 "A"

迴圈遍歷多維數組

要迴圈遍歷多維數組,你需要為數組的每個維度使用一個迴圈。

以下示例輸出 letters 數組中的所有元素:

string letters[2][4] = {
  { "A", "B", "C", "D" },
  { "E", "F", "G", "H" }
};

for (int i = 0; i < 2; i++) {
  for (int j = 0; j < 4; j++) {
    cout << letters[i][j] << "\n";
  }
}

此示例顯示如何迴圈遍歷三維數組:

string letters[2][2][2] = {
  {
    { "A", "B" },
    { "C", "D" }
  },
  {
    { "E", "F" },
    { "G", "H" }
  }
};

for (int i = 0; i < 2; i++) {
  for (int j = 0; j < 2; j++) {
    for (int k = 0; k < 2; k++) {
      cout << letters[i][j][k] << "\n";
    }
  }
}

為什麼使用多維數組?

多維數組非常適合表示網格。此示例展示了它們的實際用途。在以下示例中,我們使用多維數組表示一個小型的戰艦游戲:

// 我們放置 “1” 來表示那裡有一艘船。
bool ships[4][4] = {
  { 0, 1, 1, 0 },
  { 0, 0, 0, 0 },
  { 0, 0, 1, 0 },
  { 0, 0, 1, 0 }
};

// 通過這些變

量跟蹤玩家擊中了多少船以及玩家已經玩了多少輪

int hits = 0;
int numberOfTurns = 0;

// 允許玩家繼續進行,直到他們擊中了所有四艘船
while (hits < 4) {
  int row, column;

  cout << "選擇坐標\n";

  // 要求玩家輸入一行
  cout << "選擇 0 到 3 之間的行號:";
  cin >> row;

  // 要求玩家輸入一列
  cout << "選擇 0 到 3 之間的列號:";
  cin >> column;

  // 檢查這些坐標是否存在船隻
  if (ships[row][column]) {
    // 如果玩家擊中了一艘船,將其刪除並將值設置為零。
    ships[row][column] = 0;

    // 增加擊中計數器
    hits++;

    // 告訴玩家他們擊中了一艘船以及剩下多少艘船
    cout << "命中!剩下 " << (4-hits) << " 艘船。\n\n";
  } else {
    // 告訴玩家他們沒擊中
    cout << "未命中\n\n";
  }

  // 計算玩家進行了多少輪
  numberOfTurns++;
}

cout << "勝利!\n";
cout << "你在 " << numberOfTurns << " 輪內獲勝";

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:Let us Coding,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是R哥。 Nacos 2.3.2 前幾天正式發佈了,修複了一個重大 bug。 Nacos 先掃個盲: Nacos 一個用於構建雲原生應用的動態服務發現、配置管理和服務管理平臺,由阿裡巴巴開源,致力於發現、配置和管理微服務。 說白了,Nacos 就是充當微服務中的的註冊中心和配置中心。 推薦 ...
  • 拓展閱讀 MySQL View MySQL truncate table 與 delete 清空表的區別和坑 MySQL Ruler mysql 日常開發規範 MySQL datetime timestamp 以及如何自動更新,如何實現範圍查詢 MySQL 06 mysql 如何實現類似 oracl ...
  • Java的記憶體管理來說,就是ThreadLocal存在無法被GC回收的記憶體。這些無法被回收的記憶體,如果隨著時間的推移,從而導致超出記憶體容量「記憶體溢出」,最終導致程式崩潰「OutOfMemoryError」。所以為了避免我們的Java程式崩潰,我們必須要避免出現記憶體泄漏的問題。 ...
  • Spring Boot啟動時的初始化可通過監聽事件、實現介面及使用註解實現等方式,每種方式對應不同場景,確保應用啟動時關鍵邏輯執行。 ...
  • 前言 請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i、 準備工作:現有一個User類、Student 類和Ticket類,加入相關依賴 @Data public class User { /** * id */ private Integer id; /** * 姓名 */ private ...
  • 使用場景 RequiredActionProvider,它是在認證過程中,需要當前登錄的用戶執行個性化的動作;當用戶符合條件,就被執行RequiredActionProvider對作,當RequiredActionProvider沒有正常提交(context.success())之前,當前用戶仍然是 ...
  • 左手編程,右手年華。大家好,我是一點,關註我,帶你走入編程的世界。 公眾號:一點sir,關註領取python編程資料 在數字媒體的時代,視頻處理成為了一項重要的技能。無論是剪輯、轉碼、還是添加特效,都需要強大的工具來處理視頻素材。Python作為一門功能強大的編程語言,在視頻處理領域也有著廣泛的應用 ...
  • 單線程下的單例模式: public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...