C專家程式設計 (六)

2021-10-05 17:34:52 字數 3006 閱讀 9407

1.陣列從宣告和使用來解釋

(1)宣告:

a.extern,如extern char a[ ];不能改寫成指標形式

b.定義,如char a[10];不能寫成指標的形式

c.函式的引數,如func(char a[ ] );可以選擇陣列或指標形式

(2)表示式:

如 c = a[i]; 可以選擇陣列或指標形式

2.兩者相同的c語言標準的規則如下:

(1)規則1:表示式中的陣列名就是指標

a.在表示式中,陣列和指標是可以互換的,因為它們在編譯器中都是指標,都可以取下標操作

eg:a[6] 與 6[a] 都是等價的

(2)規則2:c語言吧陣列下標作為指標的偏移量

a.無論是指標還是陣列,在連續的記憶體位址上移動時,編譯器都必須計算每次前進的步長。計算方法就是偏移量乘以每個陣列元素所佔的位元組數,結算結果就是偏移陣列起始位址的實際位元組數。

(3)規則3:作為函式引數的陣列名等同於指標

a.編譯器只向函式傳遞陣列的位址,而不是整個陣列拷貝

func

(int

*i)func

(int i)

func

(int i[

2000])

//都是合法的

b.之所以只要做是為了效率問題:

c語言中,所有非陣列形式的資料實參都以傳值形式呼叫(對實參做乙份拷貝並傳遞給呼叫函式,但函式不能改變其實參的實際變數的值,而只能改變拷貝的那份),如果要拷貝整個陣列,空間和記憶體上都是很大的開銷的!

c.在函式內部使用指標,所能進行對陣列的操作幾乎和傳遞原本的陣列沒有區別,但是用sizeof來獲得陣列的長度的話,所得的結果將會不正確!

d.修改它的值只能在指標進行,陣列不可以,因為陣列名是不可修改的左值,它的值永遠不能改變!!

e.陣列引數的位址和陣列引數的第乙個元素的位址是不一樣的!!

1.初始化問題

a.一維陣列可以把初始化都放在一對花括號內來完成初始化,多維陣列可以通過巢狀的花括號來進行初始化;

int a=

;int b[

3]=,

}

b.只能夠在陣列宣告是對它進行整體的初始化!

c.陣列長度比所提供的初始化值的個數要多是,剩餘幾個元素會被設定成0!

d.只有字串常量才能初始化指標陣列,非字串的型別不能直接初始化指標陣列

char

*a=;

//合法的**

****

****

****

****

*int

*b=,

,};//非法的

1.多維陣列記憶體形式,例如是二維陣列 a[1][2]

假想:就是乙個矩陣

實際記憶體:是以線性排列在記憶體中的

編譯器:會編譯成*(*(a+i)+j)

2.指標陣列:

(1)char *b[20] 把 b 宣告為乙個具有20個元素的陣列,元素型別是指向字元的指標;

char (*b)[20]才算是真正宣告乙個指向字串的指標陣列!

(2)指標陣列必須用指向字串而分配的記憶體的指標進行初始化

//a---->可以用乙個常量初始化值

//b---->可以用以下迴圈初始化

for(j =

0; j <=

4; j++

) a[j]

=malloc(6

);//c--->用malloc分配整個x * y 個資料的陣列,然後用乙個迴圈,使用指標

//指向這塊記憶體的各個區域

malloc

(row_sixe * column_size *

sizeof

(char))

;

3.鋸齒狀陣列

含義:宣告乙個字串指標陣列,並根據需要為這些字元分配記憶體,因為右端長度不一,所以稱為鋸齒狀陣列。

建立方法:

char

*t[n]

;char my_string=

"you are good"

;//方法一:共享字串

t[i]

=&my_string[0]

;//方法二:拷貝字串

t[i]

=malloc

(strlen

(my_string)+1

);strcpy

(t[j]

,my_string)

;

4.向函式傳遞乙個陣列

(1)一維陣列(乙個約定):

a.增加乙個額外的引數,表示元素的數目

b.賦予陣列最後乙個元素乙個特殊的值,提示它是陣列的尾部

(2)二維陣列(兩個約定):

陣列被改寫成指向陣列第一行的指標,乙個用於提示每行的結束;

乙個用於提示所有行的結束,也可以增加一行讓所有元素值都是不能正常出現的,或者定義多另乙個引數,也就是陣列的行數。

5.使用指標向函式傳遞乙個多維陣列

最好辦法:放棄傳遞二維陣列,把array[x][y]改寫成乙個一維陣列array[x+1],元素型別是指向array[y]的指標,最後在array[x+1]裡儲存乙個null指標表示陣列結束

6.動態陣列

使用malloc()來分配得到乙個指向一大塊記憶體的指標,然後向引用陣列乙個引用這塊記憶體,其機理就是乙個陣列下標訪問可以改寫為乙個指標加上偏移量。

realloc()能夠對乙個現在的記憶體大小進行重新分配,並且不會丟失原先記憶體塊內容

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

C 專家程式設計

2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...

c專家程式設計

pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...