C 常見知識點總結

2021-07-12 04:29:36 字數 3489 閱讀 6368

1.new、delete、malloc、free的區別和聯絡

malloc/free

使用示例,

int

length = 32;

int*p = (int

*)malloc(sizeof(int)*length);

......

if (p)

free(p);

malloc的返回值是void*,所以在呼叫時要顯式地進行型別轉換,將其轉換為所需要的指標型別。

new/delete

int *p = new

int[10];

if (p)

delete p;//不可以漏掉,否則相當於delete p[0]

兩者的區別和聯絡

new/delete是c++的運算子,會呼叫物件的建構函式和析構函式;malloc/free是c++/c語言的標準庫函式。兩者都可以用於申請動態記憶體和釋放記憶體。但是對於非內部資料型別的物件而言,malloc/free是無法滿足動態物件的要求的,即物件在建立時自動執行建構函式,物件在消亡時自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠將執行建構函式和析構函式的任務強加於malloc/free。因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。

2.子類/基類 建構函式和析構函式的呼叫順序。

定義乙個物件時,先呼叫基類的建構函式,然後再呼叫繼承類的建構函式。而析構的時候恰好相反,先呼叫繼承類的析構函式,然後再呼叫基類的析構函式。

3.引用作為函式引數使用

引用是指乙個變數的別名,如,

//test

double num1 = 1;

//變數num2是變數num1的別名,但沒有複製num1,兩者指向同一塊記憶體,如果改變其中乙個變數,另乙個變數的值也會發生相應的改變

double &num2 = num1;

需要注意的是,引用在定義的時候一定要初始化。

引用在函式傳參時,具有重要作用。函式引數傳遞有值傳遞和引用傳遞兩種,值傳遞在函式內部的操作不會對實參進行任何改變,而引用傳遞中的形參相當於是實參的乙個別名,所以在函式中對形參的任何操作相當於對原實參的操作,如下所示,

void swap1(int x, int y)

void swap1(int x, int y)

void swap2(int &x, int &y)

void swap3(int *x, int *y)

void main

當以引用傳參時,常使用const關鍵字,避免在函式中對引數數值的修改,有助於提高程式的可靠性,如,

void function(const int &x)
引用也可以在函式返回中被使用,這時候並沒有複製返回值,二是返回物件的引用(即物件本身)。當函式使用引用返回時,可以是返回全域性變數的引用,或者是在函式的形參表中有引用或者指標,這兩者有乙個共同點,就是函式返回時該變數依然存在,此時的引用才有意義。相比之下,是萬萬不可以將函式內部定義的區域性變數返回的,因為函式呼叫時,函式內部定義的區域性變數也會隨之被撤銷,那麼此時返回的引用是沒有意義的!下面舉出乙個返回函式引用的例子,

int& function(int a, int b, int &result)
另外,如果不希望返回的物件被修改,可以在返回時加const修飾,如,

const

int& function(int a, int b, int& result)

void main()

此時返回物件是不可以被修改的!

4.c++記憶體分配方式

主要有三種記憶體分配方式:靜態區儲存區、棧上建立和堆上分配。其中,靜態儲存區是程式編譯的時候就已經分配好了,並且在程式的整個執行期間都存在,如全域性變數,static變數;在執行函式時,函式內部的區域性變數的儲存單元在棧上建立,函式執行結束後,這些儲存單元自動被釋放;程式在執行的時候使用malloc或者new申請的記憶體,並且由程式設計師自己負責使用free和delete釋放記憶體的變數是存放在堆上的。下面列舉乙個小例子,說明其中用到的變數的儲存位置。

int a = 0;//靜態區

char *p1;//靜態區

void main()

棧是由高位址向低位址擴充套件的資料結構,是一塊連續的記憶體區域,主要是因為棧的大小通常是系統預先設定的(如2m),如果申請的空間超過棧的剩餘空間時,將提示棧溢位。而堆是由低位址向高位址擴散的資料結構,用鍊錶來儲存空閒的記憶體位址,所以是不連續的記憶體區域,堆的大小受限於計算機系統中有效的虛擬記憶體。棧由系統自動分配,速度較快,但程式設計師是無法控制的;堆分配,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。

5.指標

基本用法,

int num = 42;

int *p1 = #//定義乙個指標p,並將num變數的記憶體位址賦給指標p,也就是說p中儲存著變數num的位址,這樣p可以指向變數num

int *p2 = new

int[10];//將new分配的位址的首位址賦給指標p2

獲取指標所指向物件的值的方式,

cout<<*p;
初始化指標

int *p1 = 0;

int *p2 = null;//與使用0初始化指標是一樣的效果

if(p1)//判斷指標是否有效,此時返回false;只要指標的位址有效,則返回true

...

void指標

int num = 42;

void *p = #//正確;void*可以存放任意型別物件的位址

指向指標的指標

int n1 = 42;

int *p1 = &n1;//指標p1存放的位址為變數n1的位址

int **p2 = &p1;//指標p2存放的位址為p1指標變數的位址,可以通過**p2獲取到最終指向的物件n1的值

6.struct結構體

struct是一種復合資料型別,其構成元素既可以是基本資料型別(如int,short等),也可以是復合資料型別(如struct,union等)。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率,預設情況下,編譯器會為結構體的每個成員按照所有成員中size最大的大小進行對齊,如,

struct va

可參考如有問題,歡迎指正~

常見C 知識點

1 非c 內建型別 a 和 b,在哪幾種情況下b能隱式轉化為a?a.class b public a b公有繼承自a,可以是間接繼承的 b.class b b實現了隱式轉化為a的轉化 c.class a a實現了non explicit的引數為b 可以有其他帶預設值的引數 建構函式 d.a oper...

常見知識點總結 1

1.獲得專案中info.plist檔案的內容 1 nsbundle mainbundle infodictionary 2 版本號在info.plist中的key kcfbundleversionkey 2.自定義控制器的view 重寫loadview方法 不需要呼叫 super loadview ...

jquery常見知識點 總結

1.jquery特點 2.jquery中css選擇器用法 jquery使用了一套css選擇器,共有5種,即標籤選擇器,id選擇器,類選擇器,通用選擇器和群組選擇器,現分述如下 標籤選擇器 用於選擇html頁面中已有的標籤元素,又稱元素選擇器,格式 element 如 div 同getelementb...