《C專家程式設計》讀書筆記10

2021-05-27 08:05:04 字數 2499 閱讀 7916

第十章  再論指標

char pea[4][6]的記憶體布局。單個元素的儲存和引用是以線性形式排列在記憶體中的。

首先找到pea[i]的位置,然後根據偏移量[j]取得字元。因此,pea[i][j]將被編譯器解析為:*( *(pea + i) + j)。

可以通過宣告乙個一維指標陣列,其中每個指標指向乙個字串來取得類似二維字元陣列的效果。這樣的宣告如下:

char *pea[4];

用於實現多維陣列的指標陣列有多種名字,如「iliffe」向量、「display」或者「dope」向量。

這種陣列必須用指向為字串而分配的記憶體的指標進行初始化,可以在編譯時用乙個常量初始值,也可以在執行時用下面這樣的**進行初始化。

for ( j = 0; j <= 4; j++) 

另一種方法是一次性地用malloc分配整個x×y個資料的陣列,

malloc( row_size * column*size * sizeof(char));

然後,使用乙個迴圈,用指標指向這塊記憶體的各個區域。整個素組保證能夠儲存在連續的記憶體中,即按c用於分配靜態陣列的次序。它減少了malloc的維護性開銷,但缺點是當處處理完乙個字串時無法單獨將其釋放。

當看見squash[i][j]這樣的形式時,並不知道它是怎樣被宣告的。有可能是以下幾種

int squash[23][12];    /*int型別的二維陣列*/

int *squash[23];      /*int型別指標的iliffe向量*/

int **squash;    /*int型別的指標的指標*/

int (*squash)[12];    /*型別為int陣列(長度為12)的指標*/

陣列的陣列 與 字串指標陣列 的區別

建立乙個鋸齒狀陣列

char *turnip[umpteen];

char my_string = 「your message here」;

/*共享字串*/

turnip[i]= &my_string[0];

/*拷貝字串*/

turnip[j] = malloc (strlen (my_string) + 1);

strcpy(turnip[j], my_string);

只要有可能,盡量不要選擇拷貝整個字串的方法。如果需要從兩個不同的資料結構訪問它,拷貝乙個指標比拷貝整個陣列快得多,空間也節省很多。另乙個可能影響效能的因素是iliffe向量可能會使字串分配於記憶體中不同的頁面中。

「陣列名被改寫成乙個指標引數」規則並不是遞迴定義的。陣列的陣列會被改寫為「陣列的指標」,而不是「指標的指標」。

my_function_1( int fruit[2][3][5])

my_function_2( int fruit[3][5])

my_function_3( int (*fruit)[3][5])

int apricot[2][3][5];

my_function_1(apricot);

my_function_2(apricot);

my_function_3(apricot);

int (*p)[3][5]=apricot;

my_function_1(p);

my_function_2(p);

my_function_3(p);

int (*q)[2]][3][5] = &apricot;

my_function_1(*q);

my_function_2(*q);

my_function_3(*q);

能夠採取的最好方法是放棄傳遞乙個二維陣列,把array[x][y]這樣的形式改寫為乙個一維陣列array[x+1],它的元素型別是指向array[y]的指標。在陣列最後的那個元素array[x+1]裡儲存乙個null指標,提示陣列的結束。

實參限制為除最左邊一維外所有維都必須與形參匹配的陣列。

my_function ( int my_array[10][20]);

它迫使函式只處理10行20列的int型陣列。

my_function ( int my_array[20]);或者

my_function ( int (*my_array)[20]);/* (*my_array)周圍的括號是絕對必須的,這樣可以確保它被翻譯為乙個指向(20個元素的int陣列)的指標,而不是乙個20個int指標的陣列*/

每行必須是20個整數的長度。

iliffe向量這種資料結構的美感在於:它允許任意的字串指標陣列,但必須是指標陣列,而且必須是指向字串的指標陣列。這是因為字串和指標都有乙個顯式的越界值(分別為nul和null),可以作為結束標記。

嚴格來說,無法直接從函式返回乙個陣列,但是,可以讓函式返回乙個指向任何資料結構的指標,當然也可以是乙個指向陣列的指標。

int ( *paf())[20];

paf是乙個函式,它返回乙個指向20個int元素的陣列的指標。

const int limit= 10;

charplum[limit];/*錯誤,const int不能被當做乙個整型常量表示式*/

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記

第一章 const float 表示乙個指向float型別常量的指標 第二章 1.在c語言中const並非真正表示 常量 在陣列定義與case中不可以使用 2.case的一些問題 2 3 main 15 這段 列印出來的是 3.函式可見性 void sb any where 2 extern voi...

《C專家程式設計》讀書筆記9

第九章 再論陣列 宣告本身還可以進一步分成3種情況 外部宣告 external array 的宣告。陣列的定義 記住,定義是宣告的一種特殊情況,它分配記憶體空間,並可能提供乙個初始值 函式引數的宣告。所有作為函式引數的陣列名總是可以通過編譯器轉換為指標。作為函式定義的形式引數,char s和 cha...