c 學習筆記3

2021-10-19 06:58:08 字數 2568 閱讀 8860

@[toc]主要內容為以下兩部分

1.空指標

2.動態記憶體分配

0帶來的二義性問題

在c++03及以前的標準中,空指標使用"0"來表示,0既是乙個常量整數,也是乙個常量空指標。它在用作指標的時候表示空指標,同時它也是乙個整數,這就產生了二義性

c語言中,空指標使用(void*)0來表示。

除此之外,有一種使用"null"表示空指標的表達方式,實際上是由不同的編譯器根據情況實現的,比如,將null作為乙個巨集,使用編譯預處理的指示符來定義(#define null 0)

不管怎樣,空指標在c++03及以前的標準裡面是存在二義性問題的。

保留字nullptr

為了使空指標成為乙個確定的東西,在c++11裡引用了乙個保留字 "nullptr"作為空指標。

下面是乙個使用nullptr的例子:

void

code()

;int

* p=

nullptr

;int

* q;

q=&x;}

在這個函式裡,定義了三個變數:

auto x

;

這條語句中定義的變數x是乙個整形變數,x表示對x進行初始化,這是c++11裡所謂初始化列表的初始方式。

auto是c++11裡引入的新的型別推斷機制,在這裡auto根據x的初始化賦值,來推斷出x的型別,這一條語句相當於int x=10

int

* p=

nullptr

;

這條語句定義的是乙個整型指標變數p,初始化為空指標,這裡用到了c++11裡的保留字元nullptr。

int

* q;

這條語言句定義了整型指標q,它也通過c++11中初始化列表的方式被初始化為空指標。

最後一條語句,將x的位址賦給了指標q。

c語言裡我們用malloc和free這兩個函式申請和規劃記憶體,而在c++中我們則使用new和delete這兩個運算子來實現這兩個功能。

記憶體的分配與釋放

在 c++中通過運算子new申請動態記憶體,當我們用完記憶體後需要使用delete運算子將記憶體釋放掉,把這個記憶體歸還給作業系統。

我們知道計算機的記憶體會被我們不斷的申請不斷的消耗掉,申請的記憶體用完不歸還,這些記憶體就會被浪費掉,最終會導致計算機的記憶體被耗光,程式會出現錯誤。

因此我們在c++裡使用動態記憶體時new和delete通常是成對出現的。

申請動態記憶體

c++中通過運算子new申請動態記憶體,這裡new有兩種用法:

1.申請乙個變數的空間

new 《型別名》 (初值);
2.申請陣列

new 《型別名》[常量表示式];
如果申請成功,則返回指定型別記憶體的位址;

如果申請失敗,則丟擲異常,或者返回空指標(nullptr)。

釋放動態記憶體

動態記憶體使用完畢後,要用delete運算子來釋放,對應著也有兩種用法:

1.刪除乙個變數/物件

delete 《指標名》;
2.刪除陣列空間

delete  《指標名》;
就空指標而言,70號編碼規範並不適用於c++11。

例子對比

cc++

char* s=(char*)malloc(1);

char*s=new char(『a』);

free(s);

delete s;

intp=(int)malloc(4*10);

int* p=new int[10];

free§;

deletep;

c語言裡我們用(char*)malloc(1)來申請乙個位元組的記憶體,然後將記憶體的位址存到指標變數s裡去。

在c++中我們採用new char('a')的方式,括號裡的'a'是初始值,意思是,申請乙個char大小的記憶體,將記憶體的位址存到s的指標變數裡,位址裡的資料初始化為字元a

對於c++來說申請乙個整型陣列new int[10],中括號裡是乙個常量表示式,表明陣列裡有多少個元素。

在c語言中,當我們在歸還記憶體時,無論是乙個變數大小的記憶體還是乙個陣列大小的記憶體都是相同的。

free(s);  //刪除乙個變數

free(p); //刪除陣列空間

在c++中就有一些差別。

delete s;  //刪除乙個變數

deletep; //刪除陣列空間

C 學習筆記 3

最近在寫code時候,發現了關於static變數的一些使用需要注意的地方。具體的情況可以看下面的例子 aclass.h 宣告了aclass class aclass int data aclass.cpp 定義了乙個static的aclass例項 include aclass.h static ac...

c 學習筆記3

toolstrip工具欄的用法 toolstrip的設定 影象和選單用到的屬性 displaystyle屬性和textimagerelation屬性。displaystyle屬性設定工具欄上每乙個按鈕上顯示影象 顯示文字或者顯示影象和文字,預設是只顯示影象。textimagerelation屬性設定...

C 學習筆記3

陣列 foreach 多維陣列 一次new 鋸齒陣列 陣列的元素是陣列,還得再new子陣列 array類 length arraylist 動態陣列 泛型list 是具有佔位符的,型別安全性,效能優於arraylist dictionary 委託delegate和事件event 或者 用於關聯事件 ...