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

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

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

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

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

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

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

數(shù)組本身也是對象盼铁,因此可以定義指向數(shù)組的指針和引用饶火。1234int *ptrs[10]; //含有10個整型指針的數(shù)組int &refs[10]=a; //錯誤致扯,不存在引用的數(shù)組,數(shù)組的元素必須是對象int (*Parray)[10]=&arr; //Parray指向一個含有10個整數(shù)的數(shù)組int (&arrRef)[10]=arr; //arrRef引用一個含有10個整數(shù)的數(shù)組2鲤看、訪問數(shù)組元素

可以使用范圍for語句或下標(biāo)來訪問數(shù)組元素

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

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

在很多用到數(shù)組名字的地方顺饮,編譯器都會自動地將其替換為一個指向數(shù)組首元素的指針凌那。

對數(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)庫函數(shù)begin和end

上述使用a[10]的地址來表示尾后指針很容易出錯佃乘,因此標(biāo)準(zhǔn)庫定義了數(shù)組用的begin和end函數(shù)來得到數(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)算

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

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

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

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

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

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

指明要拷貝區(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++語言中沒有多維數(shù)組庆杜,通常所說的多維數(shù)組其實(shí)是數(shù)組的數(shù)組碟摆。

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

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

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

使用花括號括起來的一組值初始化多維數(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ù)量小時,表示的是內(nèi)層數(shù)組娇哆。

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

復(fù)制代碼

size_t cnt=0;

for(auto &row:a)

? for(auto &col:row)

? ? ? ? col=cnt;

? ? ? ? cnt++;

}

復(fù)制代碼

NOTE:

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

指針和多維數(shù)組

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

  也可以通過使用auto或decltype來遍歷多維數(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來簡化

復(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ù)制代碼

類型別名簡化多維數(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ù)知識荆永,有喜歡的小伙伴可以多多關(guān)注我国章。想要學(xué)習(xí)的伙伴可以加qun710520381,學(xué)習(xí)編號:久伴骂删。有不懂的問題可以來幫助你解決!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗恢,一起剝皮案震驚了整個濱河市眷射,隨后出現(xiàn)的幾起案子佛掖,更是在濱河造成了極大的恐慌,老刑警劉巖嗅绸,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猛拴,居然都是意外死亡愉昆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門焊切,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专肪,“玉大人堪侯,你說我怎么就攤上這事⊙克溃” “怎么了次洼?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵卖毁,是天一觀的道長。 經(jīng)常有香客問我翩肌,道長,這世上最難降的妖魔是什么兑宇? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任隶糕,我火速辦了婚禮,結(jié)果婚禮上站玄,老公的妹妹穿的比我還像新娘。我一直安慰自己再登,他們只是感情好晾剖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布齿尽。 她就那樣靜靜地躺著,像睡著了一般循头。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上国裳,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天偿警,我揣著相機(jī)與錄音,去河邊找鬼盒使。 笑死七嫌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的英妓。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼辑畦,長吁一口氣:“原來是場噩夢啊……” “哼腿倚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暂筝,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤硬贯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸵赖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨状,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肾砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年镐确,在試婚紗的時候發(fā)現(xiàn)自己被綠了饼煞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡息堂,死狀恐怖块促,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情振坚,我是刑警寧澤斋扰,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站屎鳍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孵坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一十饥、第九天 我趴在偏房一處隱蔽的房頂上張望逗堵。 院中可真熱鬧眷昆,春花似錦、人聲如沸亚斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赖瞒。三九已至,卻和暖如春栏饮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背境蔼。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工伺通, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涮帘。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓调缨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弦叶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

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