C++青少年簡明教程:數組

C++青少年簡明教程:數組

C++數組是一種存儲固定大小連續元素的數據結構。數組中的每個元素都有一個索引,通過索引可以訪問或修改數組中的元素。

在C++中,數組中的元素數據類型必須一致。數組是一個連續的內存區域,用于存儲相同類型的元素。在聲明數組時,需要指定數組元素的數據類型,并且在數組中的所有元素都必須是該指定類型。

如果需要存儲不同類型的元素,可能需要使用結構體、類或模板等其他方式來實現。

C++數組的基本特點:

固定大小:創建時必須指定數組的大小,且大小在數組生命周期內不可改變。

同一類型:數組中所有元素必須是相同的數據類型。

連續內存:數組元素在內存中連續存儲,這意味著可以通過指針算術來訪問元素。

數組依據維度可分為:
一維數組:用于存儲線性排列的數據。由單一的索引訪問每個元素,適用于表示單行或單列的數據集合。
多維數組:用于存儲表格形或更高維度的數據。二維數組(或矩陣)是最常見的多維數組形式。通過多個索引訪問每個元素,每個額外的維度為數據結構增加一個層級,適用于更復雜的數據組織方式,如表格、立方體等。

一維數組

一維數組是一個線性的數據結構,它包含相同類型的元素,并通過一個索引來訪問每個元素。一維數組可以看作是一個行或者一列的元素列表。如:

可以使用一排糖果或者水果來比喻一維數組。每個位置的糖果或者水果可以看作是數組的一個元素。你可以請示學生,如果我們想要找到第3個位置的糖果,應該搜索哪個位置呢?

C++ 中,聲明(定義)數組語法格式

元素的數據類型? 數組的名稱[元素數目]

【數組元素指的是數組中存儲的單個數據項。數組下標和索引是同一個概念,用于標識數組中每個元素的位置。數組下標從0開始遞增,表示元素在數組中的位置。】

元素數目也稱為數組大小,即數組中元素的個數,是一個常量值。【元素數目也稱為數組大小是一個常量值(常量表達式)。特別說明:雖然某些編譯器可能會支持變量數組,但這并不是標準的一部分。在C++中,如果你需要一個可以動態調整大小的數組,推薦使用vector容器,vector是一個動態數組,它可以在運行時動態地增加或減少元素。與數組(array)相比,vector提供了更多的靈活性,例如自動調整大小、插入和刪除元素等。】

以下是一個聲明了大小為5的整數數組的示例:

int numbers[5]; // 創建了一個能夠存儲5個整數的數組

也可以使用常量聲明數組:

const int n = 5;

int numbers[n]; // 創建了一個能夠存儲5個整數的數組

【如果您需要在運行時動態地調整數組的大小,可以考慮使用動態數組或者標準庫提供的容器類,例如vector。這些容器類提供了更靈活的數據結構,可以動態地增加或減少其大小。

以下是使用vector容器來實現動態大小的數組的示例:

#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> numbers; // 創建一個使用int類型存儲的動態數組// 在運行時向數組中添加元素numbers.push_back(10);numbers.push_back(20);numbers.push_back(30);// 輸出數組中的元素for (int i = 0; i < numbers.size(); i++) {cout << numbers[i] << " ";}return 0;
}

在這個示例中,vector容器可以存儲動態數量的整數。通過使用push_back函數,我們可以在運行時向容器中添加元素。同時,通過調用size函數,我們可以獲取容器中的元素數量,從而實現動態大小的數組。】

一維數組的初始化

1)使用大括號 {} 初始化數組,可以指定每個元素的初始值。例如:

int arr1[] = {1, 2, 3, 4, 5}; // 初始化一個包含5個元素的整型數組

2)指定整個數組的初始值。例如:

int arr2[5] = {1, 2, 3, 4, 5}; // 初始化一個包含5個元素的整型數組

3)不指定數組大小,直接使用大括號 {} 初始化數組,編譯器會自動根據初始值的個數確定數組大小。例如:

int arr3[] = {1, 2, 3, 4, 5}; // 初始化一個包含5個元素的整型數組

4)部分初始化,未指定的元素將被默認初始化為零。例如:

int arr[5] = {1, 2, 3}; // 初始化前3個元素為1、2和3,其他兩個元素默認初始化為0

5)使用循環進行初始化:

int arr[5];
for (int i = 0; i < 5; i++) {
? ? arr[i] = i + 1; // 初始化元素為1到5
}
?

數組元素賦值示例:

#include <iostream>
using namespace std;int main() {// 聲明一個整數數組,包含5個元素int numbers[5];// 初始化數組元素numbers[0] = 10;numbers[1] = 20;numbers[2] = 30;numbers[3] = 40;numbers[4] = 50;// 還可以這樣聲明數組并初始化int numbers[5] = {10, 20, 30, 40, 50};// 訪問數組元素并輸出cout << "第一個元素: " << numbers[0] << endl;cout << "第三個元素: " << numbers[2] << endl;// 修改數組元素numbers[1] = 100;// 輸出修改后的數組元素cout << "修改后的第二個元素: " << numbers[1] << endl;return 0;
}

需要注意,一維數組的索引是從0開始的,即第一個元素的索引是0,第二個元素的索引是1,依此類推。

對一維數組進行賦值或修改元素的值,示例如下:

#include <iostream>
using namespace std;int main() {int arr[5];// 賦值arr[0] = 1;arr[1] = 2;arr[2] = 3;// 修改元素值arr[2] = 4;// 訪問數組元素cout << arr[0] << endl; // 輸出:1cout << arr[2] << endl; // 輸出:4return 0;
}

、統計數組中正數和負數和0的個數

#include <iostream>
using namespace std;int main() {  int a[10] = {1, -10, 20, 0, 5, -6, 7, 0, -2, 0};  int positiveCount = 0; // 用于統計正數的個數  int negativeCount = 0; // 用于統計負數的個數  int zeroCount = 0; // 用于統計零的個數  // 遍歷數組并統計  for (int i = 0; i < 10; ++i) {  if (a[i] > 0) {  ++positiveCount;  } else if (a[i] < 0) {  ++negativeCount;  } else {  ++zeroCount;  }  }  // 輸出結果  cout << "正數的個數: " << positiveCount << ",";  cout << "負數的個數: " << negativeCount << ",";  cout << "零的個數: " << zeroCount << endl;  return 0;  
}

運行之,輸出如下:

數組中正數4個,負數3個,零3個

C語言代碼:

#include<stdio.h>int main() {  int a[10] = {1, -10, 20, 0, 5, -6, 7, 0, -2, 0};  int positiveCount = 0; // 用于統計正數的個數  int negativeCount = 0; // 用于統計負數的個數  int zeroCount = 0; // 用于統計零的個數  // 遍歷數組并統計  for (int i = 0; i < 10; ++i) {  if (a[i] > 0) {  ++positiveCount;  } else if (a[i] < 0) {  ++negativeCount;  } else {  ++zeroCount;  }  }  // 輸出結果  printf("數組中正數%d個,負數%d個,零%d個\n",positiveCount ,negativeCount, zeroCount);
}  

二維數組

二維數組是一個包含多行和多列的表格結構,它由多個一維數組組成。二維數組的元素可以通過兩個索引進行訪問,第一個索引表示行號,第二個索引表示列號。可以將二維數組看作是一個矩陣,其中每個元素由其在矩陣中的行和列決定。

例如,以下是一個包含3行和4列的二維數組的示例:

在這個示例中,通過兩個索引可以訪問每個元素,例如a[0][2]表示行號為0、列號為2的元素。

二維數組和一維數組在使用和實現上有一些區別,二維數組需要使用兩個索引來訪問元素,而一維數組只需要一個索引。此外,二維數組在內存中被連續存儲,每行的元素緊密相鄰,而一維數組的元素在內存中是連續存儲的。

可以使用一個矩陣或者棋盤來表示二維數組。你可以在黑板上畫出一個3x4的方格矩陣,并把每個方格標上數字。然后向學生解釋,我們可以使用兩個索引來找到每個方格,第一個索引表示行號,第二個索引表示列號。

可以使用珠子串來比喻二維數組。你可以用不同顏色的珠子串成一條線,然后疊加多條珠子串,每條珠子串代表二維數組的一行。然后可以請示學生,如果我們想找到第2行第3列的珠子,應該搜索哪些珠子串?

二維數組的初始化

1)使用大括號 {} 初始化二維數組,可以指定每個元素的初始值。例如:

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 初始化一個包含2行3列的二維整型數組

也可以這樣寫:

int arr[2][3] = {
? ? {1, 2, 3},
? ? {4, 5, 6}
};

每個括號對應一個維度,外層括號對應第一維,內層括號對應第二維。如果已經給出了足夠的初始化項,就可以不用寫內部嵌套的花括號了,需要注意的是,如果只給出了一部分初始化項,必須顯式地使用大括號。

2)不指定二維數組的行數,直接使用大括號 {} 初始化二維數組,編譯器會自動根據初始值的個數確定行數。例如:

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 初始化一個包含2行3列的二維整型數組

二維數組的列數必須在初始化時指定,行數可以根據初始值的個數自動確定。

3)部分初始化。例如:

int arr[2][3] = {{1, 2}, {4, 5}}; // 初始化部分元素,其他元素將默認初始化為0,相當于:

int arr[2][3] = {{1, 2,0}, {4, 5,0}};

內部嵌套的括號是可選的。

4)嵌套循環進行初始化。例如:

int arr[2][3];
for (int i = 0; i < 2; i++) {
? ? for (int j = 0; j < 3; j++) {
? ? ? ? arr[i][j] = i + j; // 根據需要自行給元素賦值
? ? }
}

二維數組的示例:

#include <iostream>
using namespace std;int main() {int a[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 輸出二維數組的元素for (int i = 0; i < 3; ++i) {for (int j = 0; j < 4; ++j) {cout << a[i][j] << " ";}cout << endl;}return 0;
}

這個示例中,定義了一個 3 行 4 列的二維整數數組 a,并初始化其元素。然后,使用嵌套的 for 循環遍歷二維數組并輸出其元素。輸出結果如下:

1 2 3 4
5 6 7 8
9 10 11 12

?

三維數組

C++中,三維數組的初始化和二維數組類似,但有點除外,二維數組的列數必須在初始化時指定,行數可以根據初始值的個數自動確定。但三維數組的每一維的大小都必須在定義時指定。

定義一個3維數組并賦初值

int a[2][3][4] = {{{1, 2, 3, 4},{5, 6, 7, 8}, 9, 10, 11, 12}}, {{13, 14, 15, 16}, {17, 18, 19, 20},{21, 22, 23, 24}}};

也可以這樣寫:

int a[2][3][4] = {
? {{1, 2, 3, 4},
? ?{5, 6, 7, 8},?
? ?{9, 10, 11, 12}},?
? {{13, 14, 15, 16},?
? ?{17, 18, 19, 20},?
? ?{21, 22, 23, 24}}
};

如果已經給出了足夠的初始化項,就可以不用寫內部嵌套的花括號了。

每個括號對應一個維度,外層括號對應第一維,內層括號對應第二維,再內層括號對應第三維。需要注意的是,如果只給出了一部分初始化項,必須顯式地使用大括號。

多維數組的構成元素優先按末尾的下標遞增的順序排列。

a[i][j][k] 中,最內層(從編程循環遍歷訪問數組元素的角度看)的下標是 k,其變化最快;次內層的下標是 j,其次變化;最外層的下標是 i,變化最慢。這種索引方式確實使得我們可以方便地訪問任意一個多維數組中的元素。

請結合下面的示例理解,三重循環遍歷三維元素的每個元素示例:

#include <iostream>
using namespace std;int main() {	int a[2][3][4]; // 定義一個3維數組// 給數組賦值int num=1;for(int i=0; i<2; i++){for(int j=0; j<3; j++){for(int k=0; k<4; k++){a[i][j][k] = num++;}}}// 輸出數組for(int i=0; i<2; i++){for(int j=0; j<3; j++){for(int k=0; k<4; k++){cout << "a[" << i << "][" << j << "][" << k << "] = " << a[i][j][k] << "  ";}cout << endl;}cout << endl;}return 0;
}

這個例子中,我們定義了一個 a[2][3][4] 的3維數組。然后我們使用三重循環遍歷每個元素,并給數組賦值。

最后,我們使用嵌套循環來遍歷數組并輸出每個元素的值。

這個程序的輸出應該是以下這個樣子:

a[0][0][0] = 1 ?a[0][0][1] = 2 ?a[0][0][2] = 3 ?a[0][0][3] = 4
a[0][1][0] = 5 ?a[0][1][1] = 6 ?a[0][1][2] = 7 ?a[0][1][3] = 8
a[0][2][0] = 9 ?a[0][2][1] = 10 ?a[0][2][2] = 11 ?a[0][2][3] = 12

a[1][0][0] = 13 ?a[1][0][1] = 14 ?a[1][0][2] = 15 ?a[1][0][3] = 16
a[1][1][0] = 17 ?a[1][1][1] = 18 ?a[1][1][2] = 19 ?a[1][1][3] = 20
a[1][2][0] = 21 ?a[1][2][1] = 22 ?a[1][2][2] = 23 ?a[1][2][3] = 24

?

定義數組時進行賦值,上面程序可修改為:

#include <iostream>
using namespace std;int main() {// 定義一個3維數組并賦初值int a[2][3][4] = {{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}, {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}};// 輸出數組for(int i=0; i<2; i++){for(int j=0; j<3; j++){for(int k=0; k<4; k++){cout << "a[" << i << "][" << j << "][" << k << "] = " << a[i][j][k] << "  ";}cout << endl;}cout << endl;}return 0;
}

小結

在 C++ 中,數組是一種用于存儲同類型數據集合的簡單且高效的方式。以下是使用數組時需要注意的重要事項:

☆數組的大小在編譯時確定,并且不能改變:

數組的大小必須在編譯時指定,并且一旦定義,數組的大小在程序的生命周期內是固定的。

int arr[5]; // 定義一個包含5個整數的數組

☆數組名實際上是指向數組第一個元素的指針:

數組名本身可以作為指針使用,指向數組的第一個元素。

int* ptr = arr; // ptr 指向 arr[0]

☆當將數組作為函數參數傳遞時,傳遞的是數組的指針,而不是整個數組:

傳遞數組給函數時,實際上傳遞的是指向數組第一個元素的指針,這意味著函數內對數組的修改會影響到原數組。

void printArray(int* array, int size) {
? ? for(int i = 0; i < size; ++i) {
? ? ? ? std::cout << array[i] << " ";
? ? }
}

☆使用 sizeof 運算符可以獲取數組的大小(以字節為單位),但通常需要除以元素的大小來得到元素的數量:

int arr[10];

int size_in_bytes = sizeof(arr); // 獲取數組大小(字節數)

int element_count = sizeof(arr) / sizeof(arr[0]); // 獲取數組元素的個數

☆數組越界訪問是未定義行為:

訪問數組時索引超出范圍會導致未定義行為,可能會導致程序崩潰或其他不可預測的結果。因此,務必確保訪問數組時索引在有效范圍內。

int arr[5];

arr[5] = 10; // 錯誤:索引越界

對于多維數組,需要按照對應的維度來訪問元素。例如,對于二維數組arr,可以通過arr[i][j]來訪問第i行第j列的元素。

☆數組是 C++ 中存儲同類型數據集合的簡單且有效的方式:

它提供快速的元素訪問,適用于已知元素數量固定的場景。然而,對于需要動態調整大小的情況,可以考慮使用 C++ 標準模板庫(STL)中的 std::vector。

關于數組更多情況可見?https://blog.csdn.net/cnds123/article/details/108936055

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

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

相關文章

期權懂帶你懂50etf認沽期權和認購期權有什么區別?

今天帶你了解期權懂帶你懂50etf認沽期權和認購期權有什么區別&#xff1f;在金融市場中&#xff0c;期權是一種允許持有者在未來某個時間以特定價格買入或賣出基礎資產的金融衍生品。 50etf認沽期權和認購期權有什么區別&#xff1f; 50ETF認沽期權和認購期權的主要區別在于它…

算法題day39(補5.25日卡:貪心算法day6)

一、刷題 1.leetcode題目 738. 單調遞增的數字 - 力扣&#xff08;LeetCode&#xff09;&#xff08;medium&#xff09; 解決&#xff1a; class Solution:def monotoneIncreasingDigits(self, n: int) -> int:list_n list(str(n))list_n [int(i) for i in list_n]for…

聚類算法—DBSCAN算法

文章目錄 DBSCAN算法基本概念1個核心思想&#xff1a;基于密度2個算法參數&#xff1a;鄰域半徑R和最少點數目minpoints3種點的類別&#xff1a;核心點&#xff0c;邊界點和噪聲點4種點的關系&#xff1a;密度直達&#xff0c;密度可達&#xff0c;密度相連&#xff0c;非密度相…

3131. 找出與數組相加的整數 I

給你兩個長度相等的數組 nums1 和 nums2。 數組 nums1 中的每個元素都與變量 x 所表示的整數相加。如果 x 為負數&#xff0c;則表現為元素值的減少。 在與 x 相加后&#xff0c;nums1 和 nums2 相等 。當兩個數組中包含相同的整數&#xff0c;并且這些整數出現的頻次相同時&…

Spi Pwm Tim 對比分析

spi SPI時序圖 (spi是主從機 所以主機需要從機數據 需要主極先喊從機 把從機喊答應了 才能開始讀從機的數據&#xff09; cpol時鐘極性 和cpha時鐘相位分析 1.cpha為高&#xff0c;cpol為高&#xff0c;則偶數上升沿有效 2.cpha為高&#xff0c;cpol為低&#xff0c;則偶數…

JVM之【GC-垃圾清除算法】

Java虛擬機&#xff08;JVM&#xff09;中的垃圾收集算法主要分為以下幾種&#xff1a; 標記-清除算法&#xff08;Mark-Sweep&#xff09;復制算法&#xff08;Copying&#xff09;標記-整理算法&#xff08;Mark-Compact&#xff09;分代收集算法&#xff08;Generational C…

vue3+three.js給glb模型設置視頻貼圖

1.在網上下載一個顯示屏或者自己畫一個,在blender中設置好顯示屏的Mesh,UV設置好,這樣方便代碼中添加紋理貼圖。可以讓美術在建模軟件中,先隨機設置一張圖片作為紋理,驗證UV是否設置好 關于如何 在blender中給模型設置UV貼圖百度很多的 // 視頻 import * as THREE from…

MacOS13-將數據庫轉為markdown,docx格式

MacOS13-將數據庫轉為markdown&#xff0c;docx格式 文章目錄 先說踩坑點各種模塊缺失 代碼效果總結參考 先說踩坑點 各種模塊缺失 tkinter mysql 沒錯&#xff0c;你可以直接點擊安裝&#xff1b; 如果還出現報錯 你需要打開終端 pip install mysqlclient再次點進去安…

xcode開發swift允許發送http請求設置

Xcode 現在新建項目默認只支持HTTPS請求&#xff0c;認為HTTP請求不安全&#xff0c;所以不支持。但是開發環境一般都是http模式&#xff0c;所以需要單獨配置才可以訪問。 需要到項目的設置里面&#xff0c;點擊info&#xff0c;如果沒有App Transport Security Setting這一項…

項目優化方案之---實現郵箱用戶登錄

之前的項目中我寫的基于SpringBoot和Vue的全棧項目已經實現了基本的用戶接口開發&#xff0c; 不過其代碼的功能單一&#xff0c;而且寫的也是有不少漏洞&#xff08;基本就像剛接手的代碼*山一樣&#xff09; 那之后的幾篇文章都來分享一下如何優化項目&#xff08;每一章都獨…

Python優化、異常處理與性能提升技巧

Python作為一種高效的編程語言&#xff0c;其靈活性和強大的功能使得它成為了許多開發者的首選。在日常的編程實踐中&#xff0c;掌握一些高效的Python技巧可以極大地提升開發效率和代碼質量。本文將介紹五個關于Python使用技巧&#xff0c;幫助你更加熟練地運用Python解決問題…

JMeter性能測試實現與分析分享

JMeter是由著名開源軟件巨頭Apache組織開發的純Java的壓力測試工具&#xff0c;它即能測試動態服務&#xff08;WebService&#xff09;&#xff0c;也能測試靜態資源&#xff0c;包括Servlet服務、CGI腳本等&#xff0c;還能測試動態語言服務&#xff08;PHP、Java、ASP.NET等…

Cocos Creator開發學習路線

1.JavaScript與TypeScript程序設計 由于可以跨平臺發布,同時要能支持h5的游戲,cocos creator選擇了JavaScript與TypeScript來做為它的開發語言,所以我們要先學習JavaScript與TypeScript。TypeScript是基于JavaScript的一個語法糖,運行的時候被編譯為JavaScript,所以我們要…

JVM學習-監控工具(二)

jmap&#xff1a;導出內存映像文件&內存使用情況 基本情況 jmap(JVM Memory Map)&#xff1a;一方法獲取dump文件(堆轉儲快照文件&#xff0c;二進制文件)&#xff0c;還可以獲取目標Java進程的內存相關信息&#xff0c;包括Java堆各區域的使用情況、堆中對象的統計信息、…

MyBatis學習(二)--MyBatis獲取參數值的兩種方式

1、搭建新的module:mybatis_parameter MyBatis獲取參數值的兩種方式&#xff1a;${}和#{} ${}的本質就是字符串拼接&#xff0c;采用sql拼接&#xff0c;無法防止sql注入 #{}的本質就是占位符賦值 &#xff0c;采用預編譯 防止sql注入 不同參數使用案例 2、單個字面量類型…

OpenHarmony嵌套類對象屬性變化:@Observed裝飾器和@ObjectLink裝飾器

上文所述的裝飾器僅能觀察到第一層的變化&#xff0c;但是在實際應用開發中&#xff0c;應用會根據開發需要&#xff0c;封裝自己的數據模型。對于多層嵌套的情況&#xff0c;比如二維數組&#xff0c;或者數組項class&#xff0c;或者class的屬性是class&#xff0c;他們的第二…

實時瞳孔分割算法-RITnet論文復現

源代碼在這里RITnet-Github 這個模型比較小眾&#xff0c;我們實驗室使用了官方提供的模型進行瞳孔中心位置提取&#xff0c;以實現視線追蹤&#xff0c;效果很好 一、數據集準備 RITnet也是那一屆openEDS數據集挑戰賽的冠軍模型&#xff0c;openEDS數據集可以從Kaggle上下載&a…

數據結構--關鍵路徑

事件v1-表示整個工程開始&#xff08;源點&#xff1a;入度為0的頂點&#xff09; 事件v9-表示整個工程結束&#xff08;匯點&#xff1a;出度為0的頂點&#xff09; 關鍵路徑&#xff1a;路徑長度最長的路徑 求解關鍵路徑問題&#xff08;AOE網&#xff09; 定義四個描述量 …

網絡網絡層之(6)ICMPv4協議

網絡網絡層之(6)ICMPv4協議 Author: Once Day Date: 2024年6月2日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 通信網絡技術_Once-Day的博客-CS…

華為OD刷題C卷 - 每日刷題 7(字符串分隔(二)、歡樂的周末)

兩段代碼分別解決了兩個不同的問題&#xff0c;下面是對它們的概述&#xff1a; 1、&#xff08;字符串分隔&#xff08;二&#xff09;&#xff09;&#xff1a; 這段代碼是解決“字符串分隔&#xff08;二&#xff09;”的問題。它提供了一個Java類Main&#xff0c;其中包含…