c primer 筆記,第二章

2021-08-10 08:25:44 字數 2544 閱讀 4869

初始化的含義是建立變數並賦予其乙個初始值,賦值的含義是將物件當前的值擦除

初始化四種方式

int n = 0;

int n = ; //用花括號稱為列表初始化,當使用列表初始化且初始值存在丟失的風險,編譯器會報錯

int n;

int n(0);

定義於函式體外的變數被初始化為0,函式體內部的內建型別變數不被初始化,類的物件的值由類決定

宣告使得名字為程式所知,再變數名前加上關鍵字extern,變數宣告規定了變數的型別和名字;定義負責建立與名字關聯的實體,申請儲存空間,也可能為變數賦乙個初始值。任何包含了顯式初始化的宣告即稱為定義。變數可以被宣告多次,但只能定義一次;在函式體內部,試圖初始化乙個由extern關鍵字標識的變數將引發錯誤。

定義引用時,程式把引用和他的初始值繫結在一起,而不是將初始值拷貝給引用;一旦初始化完成,引用無法再重新繫結到另乙個物件,因此引用必須初始化;引用並非物件,所以不能定義引用的引用;引用只能繫結在物件上,不能與字面值或某個表示式的計算結果繫結在一起。

指標本身就是乙個物件,允許對指標賦值和拷貝;指標無需在定義時賦初值;因為引用不是物件,沒有實際位址,所以不能定義指向引用的指標;不能用int型變數初始化乙個指標為空指標,即使這個變數值恰好為0也不行,最好使用nullptr初始化乙個空指標,避免使用null;void*型指標:以void*的視角來看,記憶體空間也僅僅就是記憶體空間,沒辦法啊訪問記憶體空間中所存的物件

指標與引用區別

(0)指標是乙個物件,但引用不是,引用無實際位址,所以不能定義引用的引用,也不能定 義指向引用的指標;

(1)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的);

(2)指標在引數傳遞時其實是拷貝傳遞,相當於在將指標拷貝了乙份傳過去了,此時在呼叫函式中的指標和主函式中的指標兩者指向了同一塊記憶體區域,但是在呼叫函式中修改指標並不會影響主函式中指標的值;

(3)可以有const指標,但是沒有const引用;

(4)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的);

(5)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(6)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了;

(7)」sizeof引用」得到的是所指向的變數(物件)的大小,而」sizeof指標」得到的是指標本身的大小;

(8)指標和引用的自增(++)運算意義不一樣;

const物件必須初始化;預設情況下,const物件被設定為僅在檔案內有效;如果要在多個檔案中共享const物件,必須在變數的定義之前新增extern關鍵字;常量引用僅對引用可參與的操作做出了限定。對於引用的物件本身是否常量未作限定;當執行物件拷貝操作時,頂層const無影響,拷入烤出的物件都必須有相同的底層const資格,非常亮可以轉化為常量,反之則不行。

常量表示式的值不會改變且編譯過程就可以得到計算結果constexpr型別是便於編譯器來驗證變數是否是乙個常量表示式,可以用constexpr函式去初始化constexpr變數,如果你認為乙個變數是個常量表示式,那就把它宣告為constexpr型別,這樣若並不是乙個常量表示式,則編譯器會報錯;constexpr指標的初始值必須是nullptr或者0,或者是儲存於某個固定位址的物件(定義於函式體之外的物件)constexpr修飾指標僅對指標有效,與指標所指的物件無關,constexpr把它修飾的物件置為頂層const;

ocnst int *p = nullptr;       //p是乙個指向整型常量的指標

constexpr

int *q = nullptr; //q是乙個常量指標

auto一般會忽略到頂層const,如果希望推斷出的auto型別是乙個頂層const,需要明確指出;decltype與auto不太一樣,會返回該變數的型別(包括頂層const和引用在內);引用從來都作為所引用物件的同義詞產生,只有用在decltype處是乙個例外;decltype(*p)的結果為int&而非int

/*decltype的表示式加括號與不加括號會有不同,如果變數加上一層或多層括號,編譯器就會把它當成乙個表示式,變數是一種可以作為左值的特殊表示式,所以這樣的declytpe就會得到引用型別*/

decltype((i)) d; //錯誤,d是int&,必須初始化

decltype(i) e; //正確,e是乙個(未初始化)的int

/*decltype((var))(雙層括號)的結果永遠是引用,而decltype(var)只有當var本身是乙個引用時才是引用*/

C Primer 筆記 第二章

c primer 第二章 變數和基本型別 2.1基本內建型別 有算數型別和void 型別 算數型別儲存空間大小依及其而定。算數型別表 型別含義 最小儲存空間 bool 布林型 char 字元型8 wchar t 寬字元型 16short 短整型16 int整型 16long 長整型32 float ...

c primer 學習筆記(第二章)

第二章 變數和基本型別 2.1基本內建型別 基本內建型別中,因為位數的不同,這些型別所表示的最大最小值也因機器的不同而不同。即 c 基本資料型別的儲存空間依機器而定 型別含義 最小儲存空間 bool 布林型 char 字元型8bit wchar t 寬字元型 16bit short 短整型16bit...

C primer學習筆記(第二章)

typedef char pstring const pstring cstr 0 這裡的const修飾的是指標,所以pstring是乙個常量指標,而不是指向常量的指標 const pstring ps 不能錯誤地替換pstring 為 char const char cstr 0 這樣將導致錯誤的...