與vector的異同
陣列中元素的個數也屬於陣列型別的一部分,編譯的時候維度應該是已知的,也就是說,維度必須是乙個常量表示式。
預設情況下,陣列的元素被預設初始化。
note:
可以對陣列元素進行列表初始化,此時允許忽略陣列的維度。當指定了維度,則維度應比列表初始值的數量多,當維度比初始化列表的數量大時,多的部分預設初始化。
字元陣列允許用字串字面值來進行初始化,但陣列的維度必須比字串字面值大1,用來盛放新增的空字元'/0';
char a="hi";char a1[2]="
hi"; //
錯誤,最後的空字元'/0'沒地方放
不能將陣列的內容拷貝給其他陣列作為初始值,也不能用陣列為其他陣列賦值
int a=;int b=a; //
不允許使用乙個陣列初始化另乙個陣列
int b=a; //
不允許把陣列直接賦值給另一陣列
陣列本身也是物件,因此可以定義指向陣列的指標和引用。
int *ptrs[10]; //含有10個整型指標的陣列int &refs[10]=a; //錯誤,不存在引用的陣列,陣列的元素必須是物件
int (*parray)[10]=&arr; //parray指向乙個含有10個整數的陣列
int (&arrref)[10]=arr; //arrref引用乙個含有10個整數的陣列
可以使用範圍for語句或下標來訪問陣列元素
在使用下標的時候,通常將其定義為size_t型別。size_t型別是一種機器相關的無符號型別,它被設計得足夠大以便能表示記憶體中任意物件的大小。在cstddef標頭檔案中定義了size_t型別。
遍歷陣列所有元素,最好的方法是範圍for語句。
在很多用到陣列名字的地方,編譯器都會自動地將其替換為乙個指向陣列首元素的指標。
對陣列的元素使用取位址符就能得到指向該元素的指標。
指向陣列元素的指標可以執行迭代器一樣的操作。
int a[10] = ;int n = 0
;
for (auto &i : a)
int *p1 = a; //
相當於迭代器的begin
int *p2 = &a[10];
//相當於迭代器的end
for (int *p3 = p1; p3 != p2; p3++)
上述使用a[10]的位址來表示尾後指標很容易出錯,因此標準庫定義了陣列用的begin和end函式來得到陣列的首指標和尾後指標,其在iterator標頭檔案中。
int a[10] = ;int n = 0
;
for (auto &i : a)
/*int *p1 = a;
int *p2 = &a[10];
*/int *p1 =begin(a);
int *p2 =end(a);
for (int *p3 = p1; p3 != p2; p3++)
二者同樣的效果。
指標加上乙個整數得到的結果仍是乙個指標,因此可以解引用該指標。
對陣列執行下標運算其實是對指向陣列元素的指標執行下標運算。
int i=a[2];//
上面的下標引用其實是下面的過程
int *p=a;
i=*(p+2);
雖然標準庫型別vector和string也能執行下標運算,但是陣列與它們相比還是有所不同。標準庫型別限定使用的下標必須是無符號型別,而內建的下標運算無此要求。
int *p=&a[2];int j=p[1]; //
實際是a[3]
int k=p[-2]; //
實際上是a[0]
c風格字串:以空字元結尾的字元陣列。
string提供乙個名為c_str()的成員函式來將string轉換為c風格字串,返回的是const char*型別。
指明要拷貝區域的首元素位址和尾後位址即可。
int a=;vector
v(begin(a),end(a));
note:不能用vector初始化陣列。
c++語言中沒有多維陣列,通常所說的多維陣列其實是陣列的陣列。
int a[3][4]; //大小為3的陣列,每個元素是含有4個整數的陣列
int b[10][20][30];
使用花括號括起來的一組值初始化多維陣列,和普通陣列初始化一樣,只是陣列的元素也是陣列而已。
int a[3][4]=,,};int a[3][4]=; //
和上面的效果一樣
int a[3][4]=,,}; //
其餘的預設初始化
表示式含有的下標運算子數量和陣列的維度一樣多,該表示式的結果將是給定型別的元素;當比陣列的 維度數量小時,表示的是內層陣列。
size_t cnt=0;for(auto &row:a)
for(auto &col:row)
col=cnt;
cnt++;
}
note:
使用範圍for語句處理多維陣列,除了最內層的迴圈外,其他所有迴圈的控制變數都應用是引用型別。為了防止編譯器將auto控制變數轉換成陣列首元素的指標。
當程式使用多維陣列的名字時,也會自動將其轉換成指向陣列首元素的指標。
也可以通過使用auto或decltype來遍歷多維陣列
int a[3][4] ={};int cnt = 0
;
for (auto p = a; p != a + 3; p++)
}for (auto p = a; p != a + 3; p++)
cout
<}
也可以使用begin和end來簡化
int a[3][4] ={};int cnt = 0
;
for (auto p = begin(a); p != end(a); p++)
}for (auto p = begin(a); p != end(a); p++)
cout
<}
using int_array=int[4];
int a[3][4] ={};
int cnt = 0
;
for (auto p = begin(a); p != end(a); p++)
}for (int_array *p = a; p != a + 3; p++)
cout
<}
C 系統學習 陣列
與vector的異同相同 都是存放型別相同物件的容器不同 陣列的大小確定不變,不能隨意向陣列中增加元素 1 定義和初始化內建陣列 陣列中元素的個數也屬於陣列型別的一部分,編譯的時候維度應該是已知的,也就是說,維度必須是乙個常量表示式。預設情況下,陣列的元素被預設初始化。note 定義陣列的時候必須制...
C 系統學習之六 函式
典型的函式定義包括 返回型別 函式名 由0個或多個形參組成的列表以及函式體。形參初始化的機理和變數初始化一樣。有兩種方式 引用傳遞和值傳遞 當形參是非引用型別時,形參初始化和變數初始化一樣,將實參的值拷貝給形參。當執行指標拷貝操作時,拷貝的是指標的值,拷貝之後,兩個指標是不同的指標。但通過指標可以修...
python 系統學習筆記(四) list
列表是一種用於儲存有序元素集合的資料結構,即你可以在列表中儲存元素序列。考慮乙個購物清單,上面有你需要購買的物品列表,只不過你可能希望以分號分隔他們而到python變成了逗號。列表元素被包含在方括號中,這樣python就會才會明白你指定的是乙個列表。一旦列表建立完畢,我們可以對其元素進行新增,刪除和...