C 系統學習之四 陣列

2022-08-19 12:06:12 字數 3515 閱讀 9312

與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就會才會明白你指定的是乙個列表。一旦列表建立完畢,我們可以對其元素進行新增,刪除和...