c 基礎知識點(八)

2021-08-28 03:08:47 字數 3502 閱讀 8291

記憶體分為堆區,棧區,靜態資料區

靜態資料區:程式編譯時九尾靜態變數和靜態物件分配了靜態資料儲存區。在靜態資料區中儲存的變數或物件在該程式的整個執行期間都存在(會反應在生成的exe執行程式的大小上。另外執行程式的大小會有優化,如果靜態變數沒有初始化或者初始化為0,也不會反應在exe執行程式的大小上,如果靜態資料初始化為非預設值,就會反應在exe執行程式的大小上),它們的生命週期貫穿整個程式的執行週期。比如全域性變數、static變數等就儲存在靜態資料區。

棧區:呼叫函式時,函式內的區域性變數和形式引數等在棧區中分配儲存單元。這部分變數的生命週期與函式的生命週期相同。函式執行結束,這些變數的的儲存單元也就被釋放了。

堆區:程式設計師自己在程式中使用new運算子時,系統工會在堆區分配空間。它是唯一乙個生存週期可以由程式設計師自己控制的儲存區。可以自己用new申請空間,當不用時必須用delete釋放空間。

在c語言中使用malloc和free申請和釋放記憶體空間

new運算子將根據使用者自定義型別或者系統定義型別自動執行對應的建構函式,分配相應的空間。delete運算子可根據物件型別自動執行其析構函式,完成物件的銷毀和記憶體空間的釋放。

new可以自動計算所申請空間的大小,而malloc需要程式設計師指定所需申請的空間大小。所以new比malloc功能更強大

《指標名》=new《型別》(《實參表》)

當記憶體不足時,new失敗,返回null

使用new建立陣列時,不能指定初始值。

new生成乙個物件陣列時不能帶引數,即生成物件陣列時只能呼叫無參建構函式或者全部引數都有預設值的建構函式。如果類中定義了建構函式,但沒有定義無參建構函式,且沒有定義全部都有初始值的建構函式,則該類不能用預設建構函式建立,也因此不能用new建立該類的物件陣列。

delete 《指標名》

delete 《指標名》

delete執行後,原指標所指向的記憶體空間就被釋放了,而指向該動態記憶體的指標不會發生變化,依然指向這塊動態記憶體。但是這部分記憶體已經被釋放,而且以後隨時有可能被分配給其他變數,所以此後通過該指標變數對該記憶體的任何操作都可能引發系統崩潰。此時用(p!=null)防錯毫無意義。所以應該在delete掉記憶體之後,立即手動將指標置為null。

如果new和delete使用不當,可能發生記憶體洩漏。例如,delete以後不對指標變數進行任何處理,會造成「指標懸掛」;指標變數宣告以後,沒有初始化就通過它訪問記憶體空間,可能產生「野指標」問題等等。

1定義指標變數的同時初始化。如不初始化就設定為null,避免該指標指向乙個不確定的地方,引發誤操作。

2delete指標以後,第一時間將其設定為null。

3當指標指向陣列時,謹防越界。

4不要用指標傳遞棧記憶體。不要返回乙個即將自動消失的區域性變數或區域性物件的位址。棧記憶體中的區域性變數和區域性物件不能跨函式生存。要隨時注意指標變數本身以及指標所指向的物件的生存週期。(函式內部的區域性變數在函式結束後就會被銷毀,所以不能通過指標返回乙個區域性變數的位址)

5注意區分指標變數和指標指向的記憶體空間之間的差異:指標變數p和它所指向的記憶體空間是兩個不同的概念。

例如:void fun()

指標變數p位於棧記憶體,長度100的陣列位於動態記憶體空間,位於堆記憶體,所以函式結束後,指標變數p被銷毀,而長度100的資料沒有被銷毀。造成了記憶體洩漏。

6關於指標和動態記憶體注意兩點:指標消亡了,不表示它所指向的動態記憶體會被自動釋放、自動消亡;動態記憶體釋放了,不代表指向該動態記憶體的指標會消亡或者自動變成null。

1動態記憶體分配失敗卻繼續操作

2動態記憶體空間未經初始化就使用

3動態記憶體空間越界使用

4記憶體洩漏

5繼續使用已經被釋放的動態記憶體控制項

陣列名代表陣列所在的記憶體空間的首位址。為陣列所分配的記憶體空間大小以及陣列元素的多少等在陣列的生命期內不能改變,但陣列的內容可以改變。

指標變數就是乙個可用於存放位址的變數,不同型別的位址需要不同型別的指標變數來存放。由於系統的所有位址都是等長的,所以不同型別的指標變數都是等長的,而且不同型別的位址之間可以很方便的相互轉換。換句話說,乙個指標變數幾乎可以存放任意資料型別的位址值,即它可以任意指向任何型別的記憶體塊。

示例://陣列定義:記憶體中有陣列空間,沒有字串常量

char a1=」hello iron man!」;    //定義陣列並初始化

a1[14]=』2』;    //陣列的元素值是可變的

//指標變數定義並初始化,記憶體中有指標變數,並在靜態儲存區還有乙個字串常量

//記憶體中分配兩個空間:指標變數空間,字串常量空間

char* p1=」hello world」;    //p1指向字串常量

p1[0]不可修改,因為p1指向常量

//字串陣列賦值方法

char a2=」hello baby!」;

char b2[81];

strcpy(b2,a2);

//複製指標所指向的字串的方法

int len=strlen(a2);

char* p2=new char[len+1];

if(p2==null)

strcpy(p2,a2);

//字元指標變數的長度和該指標所指向的字串長度的區別

cout可以使用指標、指標的引用以及函式返回指標來傳遞動態記憶體。

傳值、傳引用、傳指標、傳指標的引用

傳值:常用於簡單基本型別的引數的傳遞,即複製乙份,將新的複製的值傳入函式

傳引用:加&符號,即將該值本身傳入函式,在函式中修改該值,函式外也被修改。

傳指標:複製乙個指標,和源指標指向相同位置,將複製後的指標傳入函式中。

傳指標的引用:將該指標本身傳入函式。

利用指標傳值

char* testpointerforwardvalue(char* pchar2);

利用指標的引用傳值

char* testreferencepointer(char* &rpchar);

簡單基本型別的型別轉換

int a=10;

double b=(double)a;

double b=double(a);

需要類定義有只有乙個引數的建構函式或者其他引數都有預設值的建構函式

需要類過載型別轉換函式

operator 《基本資料型別名》()

示例:operator double()

與以前的過載運算子函式不同的是,類型別轉換函式沒有返回值型別,因為《基本資料型別名》就代表了返回型別。類型別轉換函式也沒有任何引數,在呼叫過程中要傳入乙個物件實參。

示例:int a;

//類型別à基本型別

a=int(ocf);或者a=ocf;

//基本型別à類型別

ocf=10;

命名空間的使用

namespace namespace_name

使用命名空間語法規則

1命名空間名字::命名空間成員

2 using namespace 命名空間名字

可以對命名空間的名字起別名

示例:namespace n2=yournamespace;

C 基礎知識點

1.單行注釋 多用於給變數注釋 2.多行注釋 多用於大段文字注釋 3.文件注釋 多用於給類和方法注釋 只能以字母 或者 符號開頭。開頭暫時不要用,它們有自己特殊的意義 後面可以跟任意的字母數字下劃線 命名法 1 camelclass駝峰命名法 變數名首單詞的首字母小寫,其餘的每個單詞的首字母大寫eg...

C 基礎知識點

主要包含c 常用語句 語言特徵 物件導向程式設計基礎 集合和索引。c 常用語句 物件導向程式設計基礎 高階程式設計 多重介面實現,c 不允許多重類繼承,但c 允許多重介面實現,定義時基類必須在介面之前,如 public class mobile phone,iusb,ibluetooth publi...

c 基礎知識點

1.new 修飾符可以隱藏從基類繼承的方法。2.socket 3.delegant 4.event 5.靜態方法,靜態建構函式 靜態建構函式只執行一次。6.抽象函式,繼承類,不適用override關鍵字方法 7.object 是什麼資料型別。8.反斜槓 backslash 9.dataset can...