C 系統學習 陣列

2021-08-22 11:37:53 字數 3523 閱讀 2076

與vector的異同相同:都是存放型別相同物件的容器不同:陣列的大小確定不變,不能隨意向陣列中增加元素

1、定義和初始化內建陣列

陣列中元素的個數也屬於陣列型別的一部分,編譯的時候維度應該是已知的,也就是說,維度必須是乙個常量表示式。

預設情況下,陣列的元素被預設初始化。note:定義陣列的時候必須制定陣列型別,不允許用auto陣列元素應為物件,不能是引用顯式初始化陣列元素

可以對陣列元素進行列表初始化,此時允許忽略陣列的維度。當指定了維度,則維度應比列表初始值的數量多,當維度比初始化列表的數量大時,多的部分預設初始化。字元陣列的特殊性

字元陣列允許用字串字面值來進行初始化,但陣列的維度必須比字串字面值大1,用來盛放新增的空字元』/0』;char a=」hi」;char a1[2]=」hi」; //錯誤,最後的空字元』/0』沒地方放不允許拷貝和賦值  不能將陣列的內容拷貝給其他陣列作為初始值,也不能用陣列為其他陣列賦值int a=;int b=a; //不允許使用乙個陣列初始化另乙個陣列 int b=a; //不允許把陣列直接賦值給另一陣列理解複雜的陣列宣告

陣列本身也是物件,因此可以定義指向陣列的指標和引用。1234int *ptrs[10]; //含有10個整型指標的陣列int &refs[10]=a; //錯誤,不存在引用的陣列,陣列的元素必須是物件int (*parray)[10]=&arr; //parray指向乙個含有10個整數的陣列int (&arrref)[10]=arr; //arrref引用乙個含有10個整數的陣列2、訪問陣列元素

可以使用範圍for語句或下標來訪問陣列元素

在使用下標的時候,通常將其定義為size_t型別。size_t型別是一種機器相關的無符號型別,它被設計得足夠大以便能表示記憶體中任意物件的大小。在cstddef標頭檔案中定義了size_t型別。

遍歷陣列所有元素,最好的方法是範圍for語句。檢查下標的值3、指標和陣列

在很多用到陣列名字的地方,編譯器都會自動地將其替換為乙個指向陣列首元素的指標。

對陣列的元素使用取位址符就能得到指向該元素的指標。

指標也是迭代器

指向陣列元素的指標可以執行迭代器一樣的操作。複製** 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++) 複製**標準庫函式begin和end

上述使用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]與舊**的介面混用string物件和c風格字串

c風格字串:以空字元結尾的字元陣列。

string提供乙個名為c_str()的成員函式來將string轉換為c風格字串,返回的是const char*型別。使用陣列初始化vector物件

指明要拷貝區域的首元素位址和尾後位址即可。int a=;vector v(begin(a),end(a));

note:不能用vector初始化陣列。

盡量不使用陣列和指標,而使用vector和迭代器

盡量不使用c風格字串,而使用string

多維陣列

c++語言中沒有多維陣列,通常所說的多維陣列其實是陣列的陣列。

int a[3][4];  //大小為3的陣列,每個元素是含有4個整數的陣列

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

多維陣列的初始化

使用花括號括起來的一組值初始化多維陣列,和普通陣列初始化一樣,只是陣列的元素也是陣列而已。

複製**

int a[3][4]=,,};

int a[3][4]=; //和上面的效果一樣

int a[3][4]=,,}; //其餘的預設初始化

複製**

多維陣列的下標引用

表示式含有的下標運算子數量和陣列的維度一樣多,該表示式的結果將是給定型別的元素;當比陣列的 維度數量小時,表示的是內層陣列。

使用範圍for語句處理多維陣列

複製**

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 << endl;

}

複製**

也可以使用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 << endl;

}

複製**

型別別名簡化多維陣列的指標

複製**

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 << endl;

}

C 系統學習之四 陣列

與vector的異同 陣列中元素的個數也屬於陣列型別的一部分,編譯的時候維度應該是已知的,也就是說,維度必須是乙個常量表示式。預設情況下,陣列的元素被預設初始化。note 可以對陣列元素進行列表初始化,此時允許忽略陣列的維度。當指定了維度,則維度應比列表初始值的數量多,當維度比初始化列表的數量大時,...

系統學習C (2)

第一部分是c 的一些基本的知識,還沒有涉及成段的 而且都是一些零散的知識點,第二部分,涉及了函式的知識,涉及的知識點會多一點。練習6.4 編寫乙個與使用者互動的函式,要求使用者輸入乙個數字,計算生成該數字的階乘。在main函式中呼叫該函式。程式實現 include using namespace s...

系統學習C (4)

1 子類建立物件時 當從父類派生乙個子類並宣告乙個子類的物件時,它將先呼叫父類的建構函式,然後呼叫當前類的建構函式來建立物件 在釋放子類物件時,先呼叫的是當前類的析構函式,然後是父類的析構函式。下面簡單用程式展示這一點 father.h include using namespace std cla...