與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í)編號:久伴骂删。有不懂的問題可以來幫助你解決!