C primer plus筆記整理 05

2021-07-14 15:32:19 字數 2138 閱讀 6720

允許指定占用特定位數的結構成員

官方說法:

類和結構可包含比整型型別占用更少儲存空間的成員,這些成員被指定為位域

語法:declarator : constant-expression

注意:1.其中declarator 是在程式中訪問的成員的名稱,它必須是整型型別(包括列舉型別)

2.常數表示式指定結構中成員所佔據的位數,位數為 0 的未命名位域強制將下乙個位域與下乙個type 邊界對齊,其中type 是成員的型別

拿了msdn上兩個例子如下(->__->):

struct date ;
這個date結構在記憶體中的儲存形式如下圖所示:

基本資料型別是unsigned short,以2個位元組為倍數對齊。像date中的nmonth,在遇到兩個位元組剩餘的位元組無法容納它時,給其分配一塊新的2位元組記憶體區域。

遇上包含長度為0的未命名字段,如下所示:

struct date ;
上面的注意中提到過:遇上這種既無名,長度也為0的字段,就是乙個標識,強制你下乙個元素開始的位域與乙個新的基本型別邊界對齊,這裡基本資料型別是unsigned 4個位元組,無符號的整形,所以這個date在記憶體中的排布方式如下圖所示

這裡就是從左往右申請新的記憶體,並將資料沿邊界對齊

引用下面這篇部落格中的乙個例子:

unionx;

char c;

}v;v.c=100;

cout

*441(或者5)

*/

分析一下上面這個**段:

咱們這個計算機是小端位元組序,高位資料在低位記憶體位置,100 儲存格式就是s1:01 s2:100 s3:100,其實可以把這看作自然儲存。

本人機器輸出是1(有時是5,那是因為前面那一位不確定,為1或0,101或者001),看你記憶體中駐留的是0還是1

位域的存在是基於位元位的,將乙個位元組中的bit位劃分為幾個不同的區域。

因為在計算機的儲存中,有些資訊沒必要用到位元組範疇的容量,比如說建立與某個硬體裝置上的暫存器對應的資料結構,很可能需要的功能就是乙個開關,只需要0和1兩種狀態,為了處理效率和節省記憶體,使用位域宣告佔1個bit位。這樣可以使得幾個不同的物件可以使用乙個位元組的二進位制位域來表示

這裡只記錄一些書上提到的需要注意的內容:

1.堆和棧:

堆(heap): 指的是自由儲存區域,供分配記憶體用

棧(stack): 指的是已分配的值儲存的區域,如執行中程式中的變數

2.new和delete必須合理使用

new和delete必須成對出現,申請過的記憶體沒有經過delete釋放,會導致記憶體洩露,即已分配的記憶體沒被釋放再也沒法使用了,嚴重的會導致記憶體耗盡

不要嘗試釋放已經釋放的記憶體塊,會導致不確定的後果。(這種情況常常發生在你建立了兩個2個指向同乙個記憶體塊的指標,然後沒注意delete這兩個相同的指標……就相當於釋放已經釋放的記憶體塊)

3.c和c++內部都使用指標來處理陣列

陣列和指標基本等價

陣列名被解釋為其第乙個元素的位址,對陣列進行++,- -操作時候均是以陣列基本元素型別為單位進行運算

4.使用標準庫

我們一般在實際運用中,都是使用vector或array(c++11)來替代陣列,應該熟悉使用他們的成員函式

有錯誤還請指出,謝謝

C primer plus筆記整理 03

引入這個標頭檔案可以檢視系統支援的字符集的情況,因為其中包含了一些資訊如 define int max 2147483647 等等,這個表示int型別的最大表示範圍是 2147483648 2147483647 的總共2 32個數。int wrens 123 這樣的初始化唯一需要注意的是與函式區分,...

C primer plus筆記整理 04

常用的一些輸入方法 1.cin 2.cin.get 3.cin.getline 4.getline 5.getchar 這是最常用的輸入,可以同時接收幾個多個引數,並且它會自動過濾掉空白字元 tab,空格,換行 這也會使得多出來的輸入留在輸入流中,它只能截斷到需要的對應個數的引數 int a,b c...

c primer plus學習筆記

1.變數名命名規則 重要的 1 有含義 2 只能用字母字元 數字和下劃線 3 第乙個字元不能是數字 4 區分大小寫 5 不能用c 關鍵字 2.整型 1 無符合型別不能表負值 2 char short 16 int short long 32,int 和longlong 64,long c 11 寬度...