C與指標 10 12章

2021-08-11 16:30:08 字數 2530 閱讀 3500

第10章 結構和聯合

10.1 結構宣告

struct x;

struct y[20],*z;

警告:這兩個宣告被編譯器當成兩個截然不同的型別,即使它們的成員列表完全相同。因此,y和

z的型別和

x的型別不同,所以下面的語句:

z=&x

是非法的

如果想在多個檔案中使用同一種型別的結構,應該把標籤宣告或typedef 宣告放在乙個標頭檔案中,當原始檔需要這個宣告時可以使用

include

指令把那個標頭檔案包含進來

乙個結構的成員的名字可以和其他結構的成員的名字相同

結構的初始化

結構的初始化和陣列的初始化很相似

如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化

10.3結構的儲存分配

有時,我們有足夠的理由,決定不對結構的成員進行重排以減少因對齊造成的空間損失。例如,我們想把相關的結構成員儲存在一起,提高程式的可讀性和可維護性。但是,如果不存在這樣的理由,結構成員應該按照它們的邊界需要進行重排

10.4作為函式引數的結構

傳遞給函式的是乙個指向結構的指標。結構越大,把指向它的指標傳遞給函式的效率就越高

向函式傳遞指標的缺陷在於函式現在可以對呼叫程式的結構變數進行修改,如果我們不希望如此,可以在函式中使用const關鍵字來防止這類修改

對於絕大多數結構,傳遞指標顯然效率更高

10.6 聯合體

聯合的長度總是足以容納它最大的成員

如果這些成員的長度相差懸殊,當儲存長度較短的成員時,浪費的空間是相當可觀的。在這種情況下,更好的方法是在聯合中儲存指向不同成員的指標而不是直接儲存成員本身

聯合變數可以被初始化,但初始值必須是聯合第乙個成員的型別,而且它必須位於一對花括號裡面,例如:

union

int a;

float b;

char c[5];

}x=把x.a初始化為5

我們不能把這個變數初始化為乙個浮點型或字元型。如果給出的初始值是其他任何型別,它就會轉換為乙個整數並賦值給x.a

10.7 總結

可以使用結構標籤在不同的宣告中建立同樣型別的結構變數,typedef也可以用於實現這個目標

在不同的結構中出現同樣的成員名是不會引起衝突的

sizeof返回的值包含了結構浪費的記憶體空間

第11章 動態分配記憶體

11.2 malloc和

free

malloc分配的是一塊連續的記憶體

.同時,

malloc

實際分配的記憶體

有可能比請求的稍微多一些

如果作業系統無法向malloc提供更多的記憶體,

malloc

就返回乙個

nul指標,因此,對每個從

malloc

返回的指標都進行檢查,確保它不是

nul是非常重要的

向free傳遞乙個

nul引數不會產生任何效果

11.3 realloc和

calloc

malloc和

calloc

的主要區別是後者在返回指向記憶體的指標之前把它初始化為0

calloc的引數是你需要分配的元素個數和每個元素長度

realloc用於修改乙個原先已經分配的記憶體塊的大小,使用這個函式,可以使原先的記憶體擴大或縮小

如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並且把原先那塊的內容複製到新的塊上。因此,在使用

realloc

之後,就不能再使用指向舊記憶體的指標,而是應該改用

realloc

返回的新指標

如果realloc函式的第乙個引數是

nul,

那麼它的行為就和

malloc一樣

11.5 常見的動態記憶體錯誤

釋放一塊記憶體的一部分是不允許的。動態分配的記憶體必須整塊一起釋放。但是,realloc可以縮小一塊動態分配的記憶體,有效釋放它尾部的部分記憶體

不要訪問已經被free函式釋放了的記憶體

記憶體洩漏

當動態分配的記憶體不再需要使用時,它應該被釋放,這樣它以後可以被重新分配使用。分配記憶體但在使用完畢後不釋放將引起記憶體洩漏

11.7總結

如果乙個指標不是從早先的malloc,realloc,calloc函式返回的,它是不能作為引數傳遞給

free

函式的

動態分配記憶體有助於消除程式內部存在的限制

使用sizeof計算資料型別的長度,提高程式的可移植性

第12章  使用結構和指標

12.4總結

遍歷鍊錶是根據指標執行的,所以節點的物理排列無關緊要,單鏈表只能以乙個方向進行遍歷

語句提煉是一種簡化程式的技巧,其方法是消除程式中冗餘的語句

如果不同的語句事實上執行相同的功能,可以把它們寫成相同的樣子,然後再使用語句提煉簡化程式

12.6 程式設計提示的總結

消除特殊情況使**更易於維護

通過提煉語句消除if語句中的重複語句

不要僅僅根據**的大小評價它的質量

C與指標 4 6章

第四章語句 由於c不具備布林型別,所以語句在測試值時用的都是整型表示式 4.2 表示式語句 像下面的語句就是完全合法的 y 3 getchar 當這些語句被執行時,表示式被求值。但它們的結果不被儲存在任何地方,因為它們沒有使用賦值識別符號,第一條不具備任何效果,第二條則讀取輸入中的下乙個字元,接著就...

C與指標 第七章 函式

1 int func 這個宣告必須被解釋為舊式風格的宣告 只給出 func函式的返回型別 目的是保持與 ansi 標準之前的程式的相容性。乙個沒有引數的函式的原型應該寫成這樣 int func void 關鍵字 void 提示沒有任何引數,而不是表示它有乙個型別為 void 的引數。2 函式的引數是...

C語言10 12作業

1 消除小數點後面的零 include int main 2 十進位制轉二進位制 include void binary cal int n int main void return 0 3 查原碼 反碼 補碼 1 原碼就是符號位加上真值的絕對值,即用第一位表示符號,其餘位表示值.比如如果是8位二進...