C 面試常考基礎知識總結

2021-10-09 17:22:01 字數 3452 閱讀 7998

c++中,記憶體分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。堆疊

管理方式由程式設計師控制

編譯器自動管理

系統響應遍歷記錄空閒記憶體位址的鍊錶,尋找第乙個大於所申請空間的節點,進行記憶體分配不超出棧的剩餘空間,系統自動分配

空間大小4g(具體看情況)

2m,有的ide可以設定

碎片問題容易產生記憶體碎片

先進後出,不會產生碎片

生長方向向高位址增長

向低位址增長

分配方式動態分配

靜態分配和動態分配(編譯器自動釋放)

分配效率效率低

效率高(1)函式呼叫層次太深或陣列開的太大—棧溢位

(2)動態申請空間後沒後釋放

(3)陣列訪問越界。

(4)指標非法訪問。

指標

引用:引用不是新定義乙個變數, 而是給已存在的物件取了 乙個別名 ,引用型別,引用另外一種型別。 編譯器不會為引用物件新開闢記憶體空間, 它和它引用的物件共用同一塊記憶體空間 。

指標引用

int *p=&a;

int &b=a;

本質儲存的是指向物件的位址

物件的別名

初始化沒有要求(野指標,不安全)

必須初始化

指向可以改變指向

不能改變指向

占用記憶體4個位元組

被引用物件的大小

級數指標沒有級數限制

引用只有一級

自++含義p++,改變指標指向

b++,改變變數內容

int**表示二級指標

int&&表示右值引用

函式指標

指標函式

定義返回乙個指標的函式,本質是乙個函式。

是指向函式的指標變數。函式指標本身首先是乙個指標變數,該指標指向具體的乙個函式。

宣告格式char* func(char *p) ;

char* (*pf)(char *p);

例項

pf=fun;函式指標pf指向函式fun

pf(p);通過函式指標pf呼叫函式fun

c++編譯的時候,每個函式都有乙個入口位址,這個入口位址就是函式指標所指向的位址。可以用函式指標這個指標變數來呼叫函式,也是乙個可呼叫物件。引出虛函式和虛函式指標

帶有虛函式的模擬不帶虛函式的類多乙個虛指標,這個虛指標指向乙個虛表。虛表的裡面存的內容就是虛函式的位址。

class base

virtual void f()

virtual void g()

virtual void h()

private:

int baseval;

};class child : public base

virtual void f() //重寫父類

virtual void g_child()

virtual void h_child()

private:

int childval;

};void virtualfunctest()

int main()

基類虛函式表和記憶體布局

子類虛函式表和記憶體布局

陣列指標(行指標)

指標陣列

定義int (*p)[n];

int *p[n];

說明()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列

優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素

常量指標

指標常量

定義int const *p;或者const int *p;

int* const p

說明指向常量的指標,不能通過指標來修改所指向物件的值。但指標本身可以指向其他物件

指標本身的值不能被修改(指向不能變),但可以通過指標修改其所指向變數的值

記法const修飾的是*p

const修飾的是p

將*p整體看為內容,p看為位址,使用原則const修飾什麼,什麼就不能改變;則得出結論:常量指標(int const *p)表示指標指向物件的內容不能通過該指標改變,但是可以改變位址;指標常量(int * const p),表示指標的指向不能改變,但是指向物件的內容可以改變。

我們現在的計算法大多都是64bit字長也就是8位元組的cpu,對於這類cpu取8個位元組的數要比取乙個位元組要高效,也更方便。所以結構體中每個成員的首位址都是4的整數倍的話,取資料元素就會相對高效,這就是記憶體對齊的由來。每個特定平台上的編譯器都有自己預設的「對齊係數」,程式設計師可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數,其中的n就是你要指定的「對齊係數」。

資料對齊:第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置必須是該成員大小的整數倍。

結構體對齊

1.如果乙個結構體裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍位址開始儲存。

2.結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊引數的整數倍,不足的要補齊。

資料成員對齊規則:結構(struct)或聯合(union)的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照# pragma pack指定的數值(n)和這個資料成員自身長度中,比較小的那個進行。

結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack 指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

C 面試基礎知識總結 類

訪問控制和封裝 友元名字查詢與類的作用域 類的靜態成員與普通成員 在成員函式中,可以直接訪問資料成員,而在這個過程中實際上隱式地使用了乙個名為this的隱式指標,該指標指向正是這個類物件。include using namespace std struct people int main int a...

JS基礎知識點與常考面試題(一)

涉及面試題 原始型別有哪些?null是物件嗎?在js中原始的型別有6種,string number boolean null undefined symbol es6 首先原始型別儲存的值都是值,是沒有函式可以呼叫的,如undefined.tostring 此時可能會有乙個疑問,123 tostri...

JS 基礎知識點及常考面試題(一)

分為6個基本型別 number,string,boolean,null,undefine,symble 陣列,物件,函式 typeof 基本型別 typeof出了null,判斷為object,其他均能正確判斷 引用型別 函式判斷為function,其他均為object instanceof 內部機制...