最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++教程之a(chǎn)rray數(shù)組使用示例詳解

 更新時(shí)間:2023年03月08日 15:21:47   作者:月下西樓  
這篇文章主要為大家介紹了C++教程之a(chǎn)rray數(shù)組使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

上一篇文章我們介紹了C++中的迭代器,這篇文章將會(huì)介紹C++中數(shù)組的概念,數(shù)組是一種和vector類(lèi)似的數(shù)據(jù)結(jié)構(gòu),但是其在性能和靈活性上的權(quán)衡中選擇了性能而放棄了一定的靈活性,其與vector相同的地方是,它們都是同一類(lèi)型的對(duì)象的容器,也都可以通過(guò)下標(biāo)訪問(wèn)。其不同點(diǎn)是數(shù)組的大小是固定的,所以無(wú)法向一個(gè)數(shù)組添加元素,也正是因?yàn)槠浯笮」潭?,所以其在運(yùn)行時(shí)有更好的性能。

定義和初始化數(shù)組

數(shù)組是一個(gè)復(fù)合類(lèi)型,可以通過(guò)類(lèi)似a[d]的形式定義,其中a是數(shù)組名,d是數(shù)組的容量,d必須要大于0,數(shù)組的容量是數(shù)組類(lèi)型的一部分,其導(dǎo)致數(shù)組容量必須要在編譯時(shí)就已知,這要求數(shù)組容量必須是常量表達(dá)式,以下提供了數(shù)組聲明的幾種形式:

unsigned cnt = 42; //不是一個(gè)常量表達(dá)式
constexpr unsigned sz = 42; //是常量表達(dá)式

int arr[10]; //聲明一個(gè)容量為10的整型數(shù)組
int *parr[sz]; //42個(gè)指向整形指針的數(shù)組
string bad[cnt]; //這是個(gè)錯(cuò)誤聲明,因?yàn)閏nt不是常量表達(dá)式

默認(rèn)情況下,數(shù)組里面的元素都會(huì)被默認(rèn)初始化。

我們可以通過(guò)列表初始化一個(gè)數(shù)組,通過(guò)這種方式我們?cè)诙x時(shí)可以忽略數(shù)組的容量,如果我們指定了數(shù)組容量,那么在列表初始化時(shí)初始化的元素?cái)?shù)量不能超過(guò)設(shè)置的容量值,如果少于設(shè)置的數(shù)組的數(shù)量,沒(méi)有指定值的元素會(huì)使用默認(rèn)初始化的值,例子如下:

const unsigned sz = 3;
int a1[sz] = {0, 1, 2};
int a2[] = {0, 1, 2}; //可以忽略數(shù)組的容量
int a3[5] = {0, 1, 2}; //等價(jià)于{0, 1, 2, 0, 0}
string a4[3] = {"hi", "bye"}; //等價(jià)于{"hi", "bye", ""}
int a5[2] = {0, 1, 2}; //錯(cuò)誤

字符數(shù)組的定義

字符數(shù)組有一個(gè)額外的初始化方式,就是可以通過(guò)一個(gè)字符還去初始化字符數(shù)組,但是需要注意的是string是以null字符結(jié)尾的,所以在定義數(shù)組容量時(shí)要考慮null字符:

char a1[] = "C++"; //其等價(jià)于{'C', '+', '+', '\0'}
char a2[6] = "Daniel" //錯(cuò)誤,其未考慮到null字符

?需要注意的是一些編譯器是不支持?jǐn)?shù)組的拷貝,如果直接通過(guò)一個(gè)數(shù)組去初始化另一個(gè)數(shù)組可能會(huì)報(bào)錯(cuò)?

理解復(fù)雜的數(shù)組聲明

正如vector,array也可以容納所有的類(lèi)型,例如指針的數(shù)組,由于數(shù)組是一個(gè)對(duì)象,所以可以定義指向數(shù)組的指針和引用,,定義指向數(shù)組的指針或者引用可以通過(guò)以下方式:

int *ptre[10]; //ptre是一個(gè)數(shù)組,其中的元素是10個(gè)指向整型的指針
int (*parray)[10] = &arr; //parray是一個(gè)指針,其指向的對(duì)象是一個(gè)容量為10的整型數(shù)組
int (&arrRef)[10] = arr; //arrRef是一個(gè)引用,其指向的是一個(gè)容量為10的整型數(shù)組

?在理解聲明時(shí)可以按照從左到右,從內(nèi)到外的順序。?

指針與數(shù)組

在C++中指針和數(shù)組關(guān)系是很近的,一般來(lái)說(shuō),當(dāng)我們使用一個(gè)數(shù)組,編譯器會(huì)自動(dòng)將其轉(zhuǎn)化為一個(gè)指針,一般來(lái)說(shuō)我們是通過(guò)地址操作符來(lái)獲取一個(gè)對(duì)象的指針的,但是對(duì)于數(shù)組而言,當(dāng)我們使用數(shù)組時(shí),編譯器將會(huì)自動(dòng)獲取一個(gè)指針指向數(shù)組的第一個(gè)元素:

string nums = {"one", "two", three}; 
string *p = &nums[0]; //p指向nums的第一個(gè)元素
string *p2 = nums //等價(jià)于string *p = &nums[0];

?在大多數(shù)表達(dá)式中,我們使用數(shù)組對(duì)象,我們其實(shí)是獲取一個(gè)指針指向數(shù)組的第一個(gè)元素?

由于這個(gè)影響,我們對(duì)于數(shù)組的操作其實(shí)絕大多數(shù)都是對(duì)于指針的操作,其中一個(gè)比較明顯的是當(dāng)我們使用auto和數(shù)組去初始化一個(gè)變量時(shí),其實(shí)是聲明了一個(gè)指針而不是數(shù)組:

int ia[] = {0, 1, 2, 3, 4};
auto ia2(ia); //ia2是一個(gè)整形指針,指向ia的第一個(gè)元素
ia2 = 43 //錯(cuò)誤,不可以將int賦值給一個(gè)指針
auto ia3(&ia[0]) //這樣看起來(lái)更清楚,ia3是整型指針

需要注意的是當(dāng)我們使用之前提到的decltype時(shí)不會(huì)發(fā)生這種轉(zhuǎn)化, decltype(ia)返回的類(lèi)型是10個(gè)整型的數(shù)組:

decltype(ia) ia3 = {0, 1, 2, 3, 4};
ia3 = p; // 錯(cuò)誤,不可以將一個(gè)整型指針賦值給一個(gè)數(shù)組
ia3[4] = i; //正確,可以對(duì)數(shù)組的元素賦值

指針是迭代器

指針也是迭代器,指向數(shù)組元素的指針同樣支持我們之前提到的vector和string中迭代器的操作,例如可以通過(guò)自增操作實(shí)現(xiàn)從一個(gè)元素移動(dòng)到下一個(gè)元素:

int arr[] = [0, 1, 2, 3, 4, 5];
int *p = arr; //現(xiàn)在p指向arr[0]
++p; //現(xiàn)在p指向arr[1]

正如我們可以使用迭代器遍歷vector中的元素,我們也可以使用指針去遍歷數(shù)組中的元素,我們可以通過(guò)上面的方式獲取數(shù)組的第一個(gè)元素的指針,那么我們又該如何獲取數(shù)組最后一個(gè)元素之后的不存在的元素呢,我們可以通過(guò)以下方式:

int *e = &arr[6];

我們只可以獲取最后一個(gè)元素的下一個(gè)元素的地址

for (int *b = arr; b != e; ++b)
    cout<< *b<<endl

雖然我們可以通過(guò)上述方式獲取數(shù)組的第一個(gè)元素的地址和最后一個(gè)元素的下一個(gè)地址,但是這并不是一個(gè)好的方法,在新的規(guī)范中已經(jīng)提供了新的函數(shù)begin和end可以獲取數(shù)組的第一個(gè)元素的地址和最后一個(gè)元素的下一個(gè)地址:

int ia[] = {0, 1, 2, 3, 4};
int *beg = begin(ia);
int *last = end(ia);

指針的算術(shù)運(yùn)算

指向數(shù)組元素的指針可以使用我們之前在迭代器的文章中提到的所有的迭代器的操作,當(dāng)我們使用指針加上或者減去一個(gè)整型的值時(shí)我們將會(huì)獲得一個(gè)新的指針,這個(gè)指針指向原來(lái)數(shù)組元素前或者后幾個(gè)位置的元素,具體的位置取決于加或者減的值:

constexpr size_t sz = 5;
int arr[sz] = {1, 2, 3, 4, 5};
int *p1 = arr; //等價(jià)于*p1 = &arr[0]
int *p2 = p1 + 4; //p2指向arr[4]

當(dāng)我們用數(shù)組加上sz時(shí),編譯器會(huì)把a(bǔ)rr轉(zhuǎn)化為指向數(shù)組第一個(gè)元素的指針,所以如下p就是指向數(shù)組最后一個(gè)元素的下一個(gè)元素,如果相加結(jié)果超出數(shù)組的范圍則會(huì)發(fā)生錯(cuò)誤:

int *p = arr + sz; //小心使用,沒(méi)有解引用
int *p3 = arr + 10; //錯(cuò)誤,數(shù)組只有5個(gè)元素,雖然編譯器可能無(wú)法檢測(cè)到這個(gè)錯(cuò)誤

和迭代器一樣,兩個(gè)指針相減其結(jié)果是兩個(gè)指針之間的距離,其前提是這兩個(gè)指針式同一個(gè)數(shù)組中的元素:

auto n = end(arr) - begin(arr);

解引用和指針的算術(shù)運(yùn)算

通過(guò)上面的介紹我們已經(jīng)知道了指針也有算數(shù)運(yùn)算,那么如何判斷是指針的算術(shù)運(yùn)算還是元素的算術(shù)運(yùn)算呢,可以和之前復(fù)雜的指針對(duì)應(yīng),都是先從括號(hào)內(nèi)部開(kāi)始:

int ia = {0, 2, 4, 6, 8};
int last = *(ia + 4); //先看括號(hào)內(nèi),所以這是指針的元素暗,last = ia[4] = 8
int last2 = *ia + 4; //ia指向ia[0], 所以last2 = ia[0] + 4 = 4

下標(biāo)與指針

我們可以看到數(shù)組其實(shí)就是一個(gè)指向數(shù)組第一個(gè)元素的指針,所以對(duì)于數(shù)組的下標(biāo)操作其實(shí)就是對(duì)于指針的算數(shù)元運(yùn)算,ia[2]等價(jià)于*(ia + 2):

int ia = {0, 2, 4, 6, 8};
int *p = &ia[2]; //p指向ia[2]的指針
int j = p[-2]; p[-2]等價(jià)于*(p - 2), 所以j = ia[0]

最后

這篇文章主要講述的是C++數(shù)組相關(guān)的內(nèi)容,更多關(guān)于C++ 數(shù)組教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景詳解

    C語(yǔ)言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景詳解

    在C語(yǔ)言編程中,strncpy函數(shù)用于安全地復(fù)制字符串,它可以指定復(fù)制的字符數(shù)以防止緩沖區(qū)溢出,這篇文章主要介紹了C語(yǔ)言中的strncpy()函數(shù)的用法及應(yīng)用場(chǎng)景的相關(guān)資料,并提供了示例代碼,需要的朋友可以參考下
    2024-10-10
  • C利用語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列

    C利用語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列

    隊(duì)列 (Queue):簡(jiǎn)稱(chēng)隊(duì),是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素。q=(a1, a2, a3, … an),其中a1為隊(duì)頭,an為隊(duì)尾,下面文章小編將為大家詳細(xì)介紹,需要的下伙伴可以參考一下
    2021-10-10
  • C/C++實(shí)現(xiàn)全排列算法的示例代碼

    C/C++實(shí)現(xiàn)全排列算法的示例代碼

    本文主要介紹了C/C++實(shí)現(xiàn)全排列算法的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • C語(yǔ)言全方位講解數(shù)組的使用

    C語(yǔ)言全方位講解數(shù)組的使用

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C語(yǔ)言課程設(shè)計(jì)之停車(chē)場(chǎng)管理問(wèn)題

    C語(yǔ)言課程設(shè)計(jì)之停車(chē)場(chǎng)管理問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之停車(chē)場(chǎng)管理問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中fstream,ifstream及ofstream用法淺析

    C++中fstream,ifstream及ofstream用法淺析

    這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例

    C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例

    本文主要介紹了C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • C/C++中的內(nèi)存管理小結(jié)

    C/C++中的內(nèi)存管理小結(jié)

    這篇文章主要介紹了C/C++中的內(nèi)存管理小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C語(yǔ)言歸排與計(jì)排深度理解

    C語(yǔ)言歸排與計(jì)排深度理解

    這篇文章主要為大家詳細(xì)的介紹了C語(yǔ)言中計(jì)數(shù)排序和歸并排序,歸并排序是創(chuàng)建在歸并操作上的一種有效的排序算法,計(jì)數(shù)排序不用比較兩個(gè)數(shù)的大小,感興趣的朋友可以參考閱讀
    2023-04-04
  • C++使用grpc實(shí)現(xiàn)回射服務(wù)器

    C++使用grpc實(shí)現(xiàn)回射服務(wù)器

    gRPC是由Google開(kāi)發(fā)的一個(gè)開(kāi)源的高性能遠(yuǎn)程過(guò)程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實(shí)現(xiàn)跨語(yǔ)言的服務(wù)通信,本文我們就來(lái)看看C++如何使用grpc實(shí)現(xiàn)回射服務(wù)器
    2024-10-10

最新評(píng)論

叶城县| 磐安县| 英超| 湘潭市| 乌拉特后旗| 太白县| 息烽县| 高雄市| 淅川县| 洞头县| 大埔县| 千阳县| 临高县| 北安市| 太原市| 和田市| 庄浪县| 广南县| 龙口市| 格尔木市| 麻城市| 高要市| 应城市| 大城县| 乡城县| 长海县| 阳东县| 岐山县| 秀山| 卓资县| 南宁市| 略阳县| 马鞍山市| 临江市| 新兴县| 东乡县| 宜章县| 焉耆| 泾川县| 巴楚县| 周宁县|