C C 基礎 筆試突擊 1 陣列

2022-09-02 12:45:06 字數 4417 閱讀 2901

概述:

陣列是一種資料格式,能夠儲存多個同型別的值。

一維陣列可用來實現線性表的順序儲存、雜湊表、堆(堆排序部分)等;

二位陣列可用來儲存圖的鄰接矩陣等。

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 = new

int[n];

//....

delete a; //

當陣列使用完畢,需要釋放記憶體空間

1.1.2 字元陣列

字元陣列的初始化既可以用字元常量也可以用常量字串(末尾有空字元)記性初始化:

方式1:char ca1 = ; //

末尾沒有null字元

char ca1 = ; //

末尾顯示新增null字元

方式2:char ca1 = "

c++"; //

末尾自動新增null字元

注:ca1的長度為3,ca2和ca3的長度為4。

const

char ch4[5] = "

hello

"; //

編譯錯誤 陣列長度應為6

另外,c/c++很多字串處理函式(strcpy,strcat等),傳遞給這些標準庫函式的指標必須是非零值並且是指向以null結束的字元陣列的第乙個元素。

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

int*[m];

for(int i = 0 ; i < m ; i++)

a[i] = new

int[n];

動態宣告的陣列任意的a[k]都是乙個int*型別,即乙個位址,所以只能a[i][j]或者*(*(a+i)+j)來訪問陣列元素。

此外動態宣告的陣列,使用後需要釋放記憶體。

for(int i = 0 ; i < m ; i++)

delete

a[i];

delete a;

1.3.1 指標運算---算數運算、關係運算

c/c++規定的合法運算包括:指標與整數的加減、同型別指標間的比較、同型別的兩個指標相減。

指標與整數的加減

當乙個指標和乙個整數進行算數運算的時候,整數在執行加法運算前始終會根據合適的大小進行調整,這個「合適的大小」就是指標所指向型別的大小。

例如:float佔據4個位元組,在計算float型指標加3的表示式時,這個3將根據float的型別大小(即此例中的4)進行調整為12。

同型別的兩個指標相減

減法運算的值是兩個指標在記憶體中的距離(以陣列元素長度為單位,不是以位元組為單位)。

同型別的兩個指標比較

進行、>=運算,前提是它們都指向同乙個陣列中的元素。根據所使用的操作符,比較表示式的值表示那個指標指向陣列更靠前或靠後。

下面的**用於清楚乙個陣列中所有的元素:

float values[5

];float *vp;

vp = &values[0

] ;

while(vp < &values[5

])

1.3.2 指標陣列與陣列指標

指標陣列:乙個陣列裡面裝著指標,即指標陣列為乙個陣列。

例如乙個有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 *ip = ia; //

指標ip指向了陣列ia的首位址

ip = &ia[4]; //

ip指向了ia[4]

ip = ia; //

重新指向ip[0]

int *ip2 = ip + 4

//ip2指向ia[4]

注:對於int a[10],可以有以下幾種方式表示a[1]:

&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...