概述:
陣列是一種資料格式,能夠儲存多個同型別的值。
一維陣列可用來實現線性表的順序儲存、雜湊表、堆(堆排序部分)等;
二位陣列可用來儲存圖的鄰接矩陣等。
1.1.1 一維陣列的宣告與初始化
1.一維陣列的宣告
應指出以下三點:
1)儲存在每個元素中的值的型別;
2)陣列名;
3)陣列中的元素數,陣列的元素數必須用值大於等於1的常量表示式定義。
需要引起注意的地方:陣列定義中型別不能使引用,因為引用是不能賦值的,而陣列中元素必須可以被賦值。
如下面的定義就是錯誤的。
int& a[10]; //雖然沒有引用陣列,但陣列可以有引用。錯誤的
int a[6] = ;注:陣列的引用可以用於函式實參傳遞。此時可確保傳遞過來的陣列長度合乎要求。int (&p)[6] = a; //
p是陣列a的引用
2.一維陣列的初始化
1)函式體外定義的內建型別陣列(即內建型別的全域性陣列),元素初始化為0;
2)函式體內定義的內建型別陣列,元素無初始化(注意,若只初始化部分元素,其後的元素此時也會被初始化為0);
3)如果不是內建型別,則不管其在哪定義,自動呼叫其預設構造器函式為其初始化,若該型別無缺省建構函式則會報錯。
注:當陣列的大小未知時,需要動態宣告一維陣列,宣告格式如下:
int* a = new1.1.2 字元陣列int[n];
//....
delete a; //
當陣列使用完畢,需要釋放記憶體空間
字元陣列的初始化既可以用字元常量也可以用常量字串(末尾有空字元)記性初始化:
方式1:char ca1 = ; //注:ca1的長度為3,ca2和ca3的長度為4。末尾沒有null字元
char ca1 = ; //
末尾顯示新增null字元
方式2:char ca1 = "
c++"; //
末尾自動新增null字元
const另外,c/c++很多字串處理函式(strcpy,strcat等),傳遞給這些標準庫函式的指標必須是非零值並且是指向以null結束的字元陣列的第乙個元素。char ch4[5] = "
hello
"; //
編譯錯誤 陣列長度應為6
1.2.1 二位陣列的宣告與初始化
初始化方式分為兩種:
1)按行初始化:
int a[3][4] = , ,};2)順序初始化:
int a[3][4] = ;注:如果只是初始化部分,則其餘的規則按照一維陣列的初始化規則。
c++規定,在宣告和初始化乙個二維陣列時,如果對二維陣列的所有元素都賦值,則第一維(行數)可以省略,但第二維一定不能省略。
1.2.2 行優先儲存和列優先儲存
本質上講,所有陣列在記憶體中都是一維線性的,c/c++中,二維陣列按照行優先順序連續儲存,因此按照行優先讀取可以順序讀取,速度更快。
注:二維陣列a[x][y]轉化為一維陣列b:a[x][y] = b[x*列數 + y]。
1.2.3 二維陣列的動態宣告
int **a = new動態宣告的陣列任意的a[k]都是乙個int*型別,即乙個位址,所以只能a[i][j]或者*(*(a+i)+j)來訪問陣列元素。int*[m];
for(int i = 0 ; i < m ; i++)
a[i] = new
int[n];
此外動態宣告的陣列,使用後需要釋放記憶體。
for(int i = 0 ; i < m ; i++)1.3.1 指標運算---算數運算、關係運算delete
a[i];
delete a;
c/c++規定的合法運算包括:指標與整數的加減、同型別指標間的比較、同型別的兩個指標相減。
指標與整數的加減
當乙個指標和乙個整數進行算數運算的時候,整數在執行加法運算前始終會根據合適的大小進行調整,這個「合適的大小」就是指標所指向型別的大小。
例如:float佔據4個位元組,在計算float型指標加3的表示式時,這個3將根據float的型別大小(即此例中的4)進行調整為12。
同型別的兩個指標相減
減法運算的值是兩個指標在記憶體中的距離(以陣列元素長度為單位,不是以位元組為單位)。
同型別的兩個指標比較
進行、>=運算,前提是它們都指向同乙個陣列中的元素。根據所使用的操作符,比較表示式的值表示那個指標指向陣列更靠前或靠後。
下面的**用於清楚乙個陣列中所有的元素:
float values[51.3.2 指標陣列與陣列指標];float *vp;
vp = &values[0
] ;
while(vp < &values[5
])
指標陣列:乙個陣列裡面裝著指標,即指標陣列為乙個陣列。
例如乙個有10個指標的陣列,其中每個指標是指向乙個整數型,那麼此陣列的定義為:
int *a[10];陣列指標:乙個指向陣列的指標,它其實還是指標,只不過它指向整個陣列。
例如乙個指向有10個整型元素陣列的指標定義為:
int (*p)[10]; //注意:二維陣列的陣列名是乙個陣列指標,若有:由於的優先順序高於*,所以必須新增()
int a[4][10對應關係如下圖:];int (*)p[10
];p = a; //
a的型別是 int(*)[10]
若有如下**:
int a[10對應關係如下圖:];int (*p)[10] = &a; //
注意此處是&a,不是a,a的型別是int*,&a的型別是int(*)[10]
int *q = a;
可見,p與q雖然都指向陣列的乙個元素,但由於p的型別與q的型別不同,p是指向有10個元素整型陣列的指標,*p的大小是40位元組,故p+1跳過40位元組;而q是指向整型的指標,*q的大小是4位元組,故q+1跳過4位元組。
1.3.3 指標在陣列中的應用
指標和陣列密切相關,特別是在表示式中使用陣列名時,該名字會自動轉換為指向陣列首元素(第0元素)的指標。
int ia = ;注:對於int a[10],可以有以下幾種方式表示a[1]:int *ip = ia; //
指標ip指向了陣列ia的首位址
ip = &ia[4]; //
ip指向了ia[4]
ip = ia; //
重新指向ip[0]
int *ip2 = ip + 4
//ip2指向ia[4]
&a[0] + 1; //&、*總結:&a[0]等價於a,為首元素的位址
(int*)&a + 1; //
&a為指向陣列的指標,與a型別不同(&a型別為int(*)[10]),但指向的單元相同,強制轉化為int*,加1跳過乙個int大小
(int*)((char*)&a + sizeof(int)) ; //
強制轉化為char*,加1跳過char的大小,跳了4次(int的大小), 再強制轉化為int*(指向a[1]的指標型別為int*)
例如這樣的宣告 int a[4][5];
&a : 型別為 int(*)[4][5];
a+i :型別為 int(*)[5];
*(a+i) :型別為 int*;
*(*(a+i) + j) :型別為int;
*(a+i) = a[i];
*(*(a+i) + j) = *(a[i] + j) = a[i][j];
陣列就暫時告一段落,最後在強調一點,在遇到指標問題的時候,首先要明確指標指向的是什麼,才能知道跳躍的長度。
不明白的可以一起交流~希望可以加深大家的理解~.~
返回目錄 -> c/c++基礎知識概述
C C 基礎 筆試突擊 2 字串
概述 字串是由零個或多個字元組成的有限序列。子串 串中任意個連續的字元組成的子串行。字串是最常見和常考的一種型別,有很多演化的問題,例如最長公共子串行等,這裡就不介紹了,只了解一下相關的基本知識和標準庫的一些函式。包含兩種 1 字串常量 以雙引號括起來的字串行是字串常量。為了相容c語言,c 所有的字...
python基礎複習突擊面試(1)
1 map 是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到乙個新的 list 並返回。例 def f x return x x print map f,1,2,3,4,5,6,7,8,9 輸出結果 1,4,9,10,...
筆試 陣列1
例題1 這道題題目是,在乙個陣列中,只有兩個數字出現過一次,其他所有的數字都在陣列中出現過一次,找出這兩個數。分析 用異或思想解決,因為除去兩個特殊的數字外,其他所有數字都出現過兩次,這些數字異或的結果為0。includeusing namespace std void main int xxory...