與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)幫助你解決!