C++系統(tǒng)學(xué)習(xí):數(shù)組

與vector的異同相同:都是存放類型相同對(duì)象的容器不同:數(shù)組的大小確定不變,不能隨意向數(shù)組中增加元素

1、定義和初始化內(nèi)置數(shù)組

數(shù)組中元素的個(gè)數(shù)也屬于數(shù)組類型的一部分,編譯的時(shí)候維度應(yīng)該是已知的,也就是說(shuō),維度必須是一個(gè)常量表達(dá)式。

默認(rèn)情況下,數(shù)組的元素被默認(rèn)初始化。NOTE:定義數(shù)組的時(shí)候必須制定數(shù)組類型,不允許用auto數(shù)組元素應(yīng)為對(duì)象,不能是引用顯式初始化數(shù)組元素

可以對(duì)數(shù)組元素進(jìn)行列表初始化,此時(shí)允許忽略數(shù)組的維度。當(dāng)指定了維度,則維度應(yīng)比列表初始值的數(shù)量多,當(dāng)維度比初始化列表的數(shù)量大時(shí),多的部分默認(rèn)初始化。字符數(shù)組的特殊性

字符數(shù)組允許用字符串字面值來(lái)進(jìn)行初始化,但數(shù)組的維度必須比字符串字面值大1,用來(lái)盛放添加的空字符'/0';char a[]="hi";char a1[2]="hi"; //錯(cuò)誤,最后的空字符'/0'沒(méi)地方放不允許拷貝和賦值  不能將數(shù)組的內(nèi)容拷貝給其他數(shù)組作為初始值,也不能用數(shù)組為其他數(shù)組賦值int a[]={0,1,2};int b[]=a; //不允許使用一個(gè)數(shù)組初始化另一個(gè)數(shù)組 int b=a; //不允許把數(shù)組直接賦值給另一數(shù)組理解復(fù)雜的數(shù)組聲明

數(shù)組本身也是對(duì)象,因此可以定義指向數(shù)組的指針和引用。1234int *ptrs[10]; //含有10個(gè)整型指針的數(shù)組int &refs[10]=a; //錯(cuò)誤,不存在引用的數(shù)組,數(shù)組的元素必須是對(duì)象int (*Parray)[10]=&arr; //Parray指向一個(gè)含有10個(gè)整數(shù)的數(shù)組int (&arrRef)[10]=arr; //arrRef引用一個(gè)含有10個(gè)整數(shù)的數(shù)組2、訪問(wèn)數(shù)組元素

可以使用范圍for語(yǔ)句或下標(biāo)來(lái)訪問(wèn)數(shù)組元素

在使用下標(biāo)的時(shí)候,通常將其定義為size_t類型。size_t類型是一種機(jī)器相關(guān)的無(wú)符號(hào)類型,它被設(shè)計(jì)得足夠大以便能表示內(nèi)存中任意對(duì)象的大小。在cstddef頭文件中定義了size_t類型。

遍歷數(shù)組所有元素,最好的方法是范圍for語(yǔ)句。檢查下標(biāo)的值3、指針和數(shù)組

在很多用到數(shù)組名字的地方,編譯器都會(huì)自動(dòng)地將其替換為一個(gè)指向數(shù)組首元素的指針。

對(duì)數(shù)組的元素使用取地址符就能得到指向該元素的指針。

指針也是迭代器

指向數(shù)組元素的指針可以執(zhí)行迭代器一樣的操作。復(fù)制代碼 int a[10] = { 0 }; int n = 0; for (auto &i : a) { i = n; n++; } int *p1 = a; //相當(dāng)于迭代器的begin int *p2 = &a[10]; //相當(dāng)于迭代器的end for (int *p3 = p1; p3 != p2; p3++) { cout << *p3 << endl; }復(fù)制代碼標(biāo)準(zhǔn)庫(kù)函數(shù)begin和end

上述使用a[10]的地址來(lái)表示尾后指針很容易出錯(cuò),因此標(biāo)準(zhǔn)庫(kù)定義了數(shù)組用的begin和end函數(shù)來(lái)得到數(shù)組的首指針和尾后指針,其在iterator頭文件中。復(fù)制代碼int a[10] = { 0 }; int n = 0; for (auto &i : a) { i = n; n++; } /*int *p1 = a; int *p2 = &a[10];*/ int *p1 = begin(a); int *p2 = end(a); for (int *p3 = p1; p3 != p2; p3++) { cout << *p3 << endl; }復(fù)制代碼二者同樣的效果。指針運(yùn)算

給指針加上一個(gè)整數(shù),得到的新指針仍需指向同一數(shù)組的其他元素,或者指向同一數(shù)組的尾元素的下一位置。解引用和指針運(yùn)算的交互

指針加上一個(gè)整數(shù)得到的結(jié)果仍是一個(gè)指針,因此可以解引用該指針。

下標(biāo)和指針對(duì)數(shù)組執(zhí)行下標(biāo)運(yùn)算其實(shí)是對(duì)指向數(shù)組元素的指針執(zhí)行下標(biāo)運(yùn)算。int i=a[2];//上面的下標(biāo)引用其實(shí)是下面的過(guò)程int *p=a;i=*(p+2);

雖然標(biāo)準(zhǔn)庫(kù)類型vector和string也能執(zhí)行下標(biāo)運(yùn)算,但是數(shù)組與它們相比還是有所不同。標(biāo)準(zhǔn)庫(kù)類型限定使用的下標(biāo)必須是無(wú)符號(hào)類型,而內(nèi)置的下標(biāo)運(yùn)算無(wú)此要求。int *p=&a[2];int j=p[1]; //實(shí)際是a[3]int k=p[-2]; //實(shí)際上是a[0]與舊代碼的接口混用string對(duì)象和C風(fēng)格字符串

C風(fēng)格字符串:以空字符結(jié)尾的字符數(shù)組。

string提供一個(gè)名為c_str()的成員函數(shù)來(lái)將string轉(zhuǎn)換為C風(fēng)格字符串,返回的是const char*類型。使用數(shù)組初始化vector對(duì)象

指明要拷貝區(qū)域的首元素地址和尾后地址即可。int a[]={0,1,2,3,4,5};vector v(begin(a),end(a));

NOTE:不能用vector初始化數(shù)組。

盡量不使用數(shù)組和指針,而使用vector和迭代器

盡量不使用C風(fēng)格字符串,而使用string

多維數(shù)組

C++語(yǔ)言中沒(méi)有多維數(shù)組,通常所說(shuō)的多維數(shù)組其實(shí)是數(shù)組的數(shù)組。

int a[3][4];  //大小為3的數(shù)組,每個(gè)元素是含有4個(gè)整數(shù)的數(shù)組

int b[10][20][30];

多維數(shù)組的初始化

使用花括號(hào)括起來(lái)的一組值初始化多維數(shù)組,和普通數(shù)組初始化一樣,只是數(shù)組的元素也是數(shù)組而已。

復(fù)制代碼

int a[3][4]={

{0,1,2,3},

{4,5,6,7},

{8,9,10,11}};

int a[3][4]={0,,1,2,3,4,5,6,7,8,9,10,11};? ? //和上面的效果一樣

int a[3][4]={{0},{1},{3}};? ? //其余的默認(rèn)初始化

復(fù)制代碼

多維數(shù)組的下標(biāo)引用

  表達(dá)式含有的下標(biāo)運(yùn)算符數(shù)量和數(shù)組的維度一樣多,該表達(dá)式的結(jié)果將是給定類型的元素;當(dāng)比數(shù)組的 維度數(shù)量小時(shí),表示的是內(nèi)層數(shù)組。

使用范圍for語(yǔ)句處理多維數(shù)組

復(fù)制代碼

size_t cnt=0;

for(auto &row:a)

? for(auto &col:row)

? ? ? ? col=cnt;

? ? ? ? cnt++;

}

復(fù)制代碼

NOTE:

  使用范圍for語(yǔ)句處理多維數(shù)組,除了最內(nèi)層的循環(huán)外,其他所有循環(huán)的控制變量都應(yīng)用是引用類型。為了防止編譯器將auto控制變量轉(zhuǎn)換成數(shù)組首元素的指針。

指針和多維數(shù)組

  當(dāng)程序使用多維數(shù)組的名字時(shí),也會(huì)自動(dòng)將其轉(zhuǎn)換成指向數(shù)組首元素的指針。

  也可以通過(guò)使用auto或decltype來(lái)遍歷多維數(shù)組

復(fù)制代碼

? ? int a[3][4] = {};

? ? int cnt = 0;

? ? for (auto p = a; p != a + 3; p++)

? ? {

? ? ? ? for (auto q = *p; q != *p + 4; q++)

? ? ? ? {

? ? ? ? ? ? *q = cnt;

? ? ? ? ? ? cnt++;

? ? ? ? }

? ? }

? ? for (auto p = a; p != a + 3; p++)

? ? {

? ? ? ? for (auto q = *p; q != *p + 4; q++)

? ? ? ? {

? ? ? ? ? ? cout << *q << " | ";

? ? ? ? }

? ? ? ? cout << endl;

? ? }? ?

復(fù)制代碼

也可以使用begin和end來(lái)簡(jiǎn)化

復(fù)制代碼

? ? ? ? int a[3][4] = {};

? ? int cnt = 0;

? ? for (auto p = begin(a); p != end(a); p++)

? ? {

? ? ? ? for (auto q = begin(*p); q != end(*p); q++)

? ? ? ? {

? ? ? ? ? ? *q = cnt;

? ? ? ? ? ? cnt++;

? ? ? ? }

? ? }

? ? for (auto p = begin(a); p != end(a); p++)

? ? {

? ? ? ? for (auto q = begin(*p); q != end(*p); q++)

? ? ? ? {

? ? ? ? ? ? cout << *q << " | ";

? ? ? ? }

? ? ? ? cout << endl;

? ? }

復(fù)制代碼

類型別名簡(jiǎn)化多維數(shù)組的指針

復(fù)制代碼

? ? using int_array=int[4];

? ? int a[3][4] = {};

? ? int cnt = 0;

? ? for (auto p = begin(a); p != end(a); p++)

? ? {

? ? ? ? for (auto q = begin(*p); q != end(*p); q++)

? ? ? ? {

? ? ? ? ? ? *q = cnt;

? ? ? ? ? ? cnt++;

? ? ? ? }

? ? }

? ? for (int_array *p = a; p != a + 3; p++)

? ? {

? ? ? ? for (int *q = *p; q != *p + 4; ++q)

? ? ? ? {

? ? ? ? ? ? cout << *q << " | ";

? ? ? ? }

? ? ? ? cout << endl;

? ? }

分享一些基礎(chǔ)的數(shù)據(jù)知識(shí),有喜歡的小伙伴可以多多關(guān)注我。想要學(xué)習(xí)的伙伴可以加qun710520381,學(xué)習(xí)編號(hào):久伴。有不懂的問(wèn)題可以來(lái)幫助你解決!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 4,032評(píng)論 0 2
  • https://blog.csdn.net/u011185231/article/details/51591571...
    燕京博士閱讀 707評(píng)論 0 0
  • 丁小雨看著雷克斯差點(diǎn)崩壞的表情,心里那個(gè)開(kāi)心啊。不過(guò),汪東城可就不開(kāi)心了,因?yàn)?..【叮,男神攻略系統(tǒng)提示您,雷克...
    愛(ài)羽毛的星星閱讀 568評(píng)論 0 1
  • 有個(gè)問(wèn)題困擾我很多年,向日葵跟著太陽(yáng)轉(zhuǎn),從東邊轉(zhuǎn)到西邊。那第二天早上是怎么回到東邊的? 大概是一個(gè)猛甩頭。你想象下...
    寞比煙花閱讀 5,580評(píng)論 2 7
  • 未來(lái)你會(huì)發(fā)現(xiàn),時(shí)間是一種多么了不起的東西。以前總認(rèn)為它的偉大在于使你忘記過(guò)去。等經(jīng)歷了之后才知道,時(shí)間并沒(méi)...
    黃大大_vvv閱讀 169評(píng)論 0 0

友情鏈接更多精彩內(nèi)容