用於實現多維陣列的指標陣列,必須用指向為字串而分配的記憶體的指標進行初始化,即一次性用malloc分配整個x*y個資料的陣列:
malloc
(row_size * col_size *
sizeof
(char))
;
然後使用乙個迴圈,用指標指向這塊記憶體的各個區域。整個陣列保證能夠儲存在連續的記憶體中,即按c用於分配靜態陣列的次序。
如果宣告乙個字串指標陣列,並根據需要為這些字串分配記憶體,將會大大節省系統資源。有些人把它稱為「鋸齒狀陣列」是因為它右端的長度不一。可以通過用字串指標填充向量來建立這種型別的陣列,字串指標可以直接使用現有的,也可以通過分配記憶體建立乙份現有字串的新鮮拷貝。例如:
char
*turnip[size]
;char my_string=
"your messages"
;// 共享字串
turnip[i]
=&my_string[0]
;// 拷貝字串
turnip[j]
=malloc
(strlen
(my_string)+1
);strcpy
(turnip[j]
, my_string)
;
只要有可能,盡量不要選擇拷貝整個字串的方法。
在編譯器中,陣列的陣列會被改寫為陣列的指標,而不是指標的指標。
在c語言中,任何一維陣列均可作為函式的實參。形參被改寫為指向陣列第乙個元素的指標,所以需要乙個約定來提示陣列的長度。一般有兩種方法:
(1)增加乙個額外引數,表示元素的個數(argc就是起這個作用)。
(2)賦予陣列最後乙個元素乙個特殊值,提示它是陣列的尾部(字串結尾的』\0』),這個特殊值必須不會作為正常的元素值在陣列**現。
二維陣列的情況要複雜一些,陣列被改寫為指向陣列第一行的指標。現在需要兩個約定,其中乙個用於提示每行的結束,另乙個用於提示所有行的結束。提示單行結束可以使用一維陣列所用的兩種方法,提示所有行結束也是如此。
我們能夠採取的最好方法就是放棄傳遞二維陣列,把array[x][y]這樣的形式改寫為乙個一維陣列array[x+1],它的元素型別是指向array[y]的指標。這樣就改變了問題的性質。在陣列最後的那個元素array[x+1]裡儲存乙個null指標,提示陣列的結束。
在c語言中,沒有辦法向函式傳遞乙個普通的多維陣列。
你必須提供除了最左邊一維以外的所有維的長度。這樣就把實參限制為除最左邊一維以外所有維都必須與形參匹配的陣列。例如:
invert_in_place
(int a[
3][5
]);// 其可接受如下呼叫
int b[10]
[3][
5];invert_in_place
(b);
int c[
999][3
][5]
;invert_in_place
(c);
對多維陣列作為引數傳遞的支援缺乏是c語言存在的乙個內在限制。這使得用c語言編寫某些特定型別的程式非常困難(如數值分析演算法)。
嚴格地說,無法直接從函式返回乙個陣列。因為不能從函式中返回乙個指向函式的區域性變數的指標。
在c語言中,陣列是靜態的,陣列的長度在編譯時便已確定不變。在這個領域,c語言的支援很弱,甚至不能使用以下形式:
const
int limit =
100;
char plum[limit]
;// 編譯器提示錯誤
在c語言中實現動態陣列,使用以下形式:
int size;
char
*dynamic;
// 為動態陣列宣告變數
dynamic =
(char*)
malloc
(size)
;dynamic[0]
='a'
;
工程師所存在的問題是他們採取欺騙的手段來獲得結果。
數學家所存在的問題是它們研究一些玩具性的問題來獲得結果。
程式檢驗員所存在的問題是他們在玩具性問題上採取欺騙手段來獲得結果。
第10章 指標 六 指標小結
要說指標到這裡,就可以結束了,但是,我所講到的內容其實就是 譚先生教材中 的第10章的前2節,很有意思的是,指標的概念就是這麼多,你應該感覺到了,幾乎是沒有難度的 那麼,指標的深奧之處,到底體現在 呢?指標的應用 1 用於實現函式引數的雙向傳輸 明修棧道,暗渡陳倉 2 用於實現陣列下標的高效運算。3...
10 c 再論建構函式
先父後兒 解釋 a,先呼叫父類的建構函式,如果有虛擬基類則先呼叫虛擬基類的建構函式,再呼叫一般基類的建構函式。b,父類構造函式呼叫完後再呼叫自己 本類中如果有物件成員,則先呼叫物件成員的建構函式,再呼叫本類的建構函式。class furniture int getweight void const ...
第九章 再論陣列
1,char s和char s等價的情況 作為函式定義的形式引數 僅限於這種情況 例項 include int main 2,對陣列的引用如a i 在編譯時,總是被編譯改寫成 a i 的形式.在表示式中,指標和陣列是可以互換的,因為他們在編譯器那裡的最終形式都是指標,並且都可以進行下標操作.3,標準...