有關C C 的一些基礎知識

2021-06-22 20:51:07 字數 4138 閱讀 1553

1.多型類中的虛函式表是compile-time,還是run-time時建立的?

答案:虛函式表是在編譯期就建立了,各個虛函式這時被組織成了乙個虛函式的入口位址的陣列.而物件的隱藏成員--虛函式表指標是在執行期--也就是建構函式被呼叫時進行初始化的,這是實現多型的關鍵.

2.乙個父類寫了乙個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型?在子類的空間裡,有沒有父類的這個函式,或者父類的私有變數?

答案:只要基類在定義成員函式時已經宣告了

virtue

關鍵字,在派生類實現的時候覆蓋該函式時,

virtue

關鍵字可加可不加,不影響多型的實現。

子類的空間裡有父類的所有變數

(static除外)

3.完成字串拷貝可以使用 sprintf、strcpy 及 memcpy 函式,請問這些函式有什麼區別

答案:這些函式的區別在於 實現功能 以及 操作物件 不同。

1.strcpy 函式操作的物件是 字串,完成 從 源字串 到 目的字串 的 拷貝 功能。

2.sprintf 函式操作的物件不限於字串:雖然目的物件是字串,但是源物件可以是字串、也可以是任意基本型別的資料。這個函式主要用來實現(字串或基本資料型別)向字串的轉換功能。如果源物件是字串,並且指定 %s 格式符,也可實現字串拷貝功能。

3.memcpy 函式顧名思義就是 記憶體拷貝,實現 將乙個 記憶體塊 的內容複製到另乙個 記憶體塊 這一功能。記憶體塊由其首位址以及長度確定。程式中出現的實體物件,不論是什麼型別,其最終表現就是在記憶體中佔據一席之地(乙個記憶體區間或塊)。因此,memcpy 的操作物件不侷限於某一類資料型別,或者說可適用於任意資料型別,只要能給出物件的起始位址和記憶體長度資訊、並且物件具有可操作性即可。鑑於 memcpy 函式等長拷貝的特點以及資料型別代表的物理意義,memcpy 函式通常限於同種型別資料或物件之間的拷貝,其中當然也包括字串拷貝以及基本資料型別的拷貝。

對於字串拷貝來說,用上述三個函式都可以實現,但是其實現的效率和使用的方便程度不同:

對於非字串型別的資料的複製來說,strcpy 和 snprintf 一般就無能為力了,可是對 memcpy 卻沒有什麼影響。但是,對於基本資料型別來說,儘管可以用 memcpy 進行拷貝,由於有賦值運算子可以方便且高效地進行同種或相容型別的資料之間的拷貝,所以這種情況下 memcpy 幾乎不被使用。memcpy 的長處是用來實現(通常是內部實現居多)對結構或者陣列的拷貝,其目的是或者高效,或者使用方便,甚或兩者兼有。

4.變數的宣告和定義有什麼區別

宣告是向編譯器介紹名字--識別符號。它告訴編譯器「這個函式或變數在某處可找到,它的模樣象什麼」。而定義是說:「在這裡建立變數」或「在這裡建立函式」。它為名字分配儲存空間。無論定義的是函式還是變數,編譯器都要為它們在定義點分配儲存空間。對於變數,編譯器確定變數的大小,然後在記憶體中開闢空間來儲存其資料,對於函式,編譯器會生成**,這些**最終也要占用一定的記憶體。  

在c和c++中,可以在不同的地方宣告相同的變數和函式,但只能有乙個定義(有時這稱為odr,單一定義規則)。。。  

定義也可以是宣告,如果有int   x;,之前編譯器未發現識別符號x,編譯器則把這一識別符號看成是定義並立即為它分配儲存空間。  

對「變數宣告」的解釋向來模糊且自相矛盾。。

函式宣告包括函式型別、函式名、引數列表和乙個分號,這些資訊足以編譯器認出它是乙個函式宣告並可識別出這個函式的外部特徵。由此推斷,變數宣告應是型別標識後面跟乙個識別符號。如int   a;但這產生了乙個矛盾,這段**有足夠的資訊讓編譯器為之分配儲存空間,而且編譯器也確實給之分配了儲存空間。要解決這個問題,對於c和c++需要乙個關鍵字來說明「這是乙個宣告,它的定義在別的地方」,這個關鍵字就是extern,它表示變數是在檔案以外定義的,或在檔案後面定義的。  

在變數定義前加extern表示宣告乙個變數但不定義它,如:  

extern   int   a;  

extern也可用於函式宣告,如:  

extern   int   func1(int  length,int   width);  

但由於沒有函式體,編譯器必把它當成宣告而非定義,extern對於函式來說是多餘的、可選的。c語言的設計者並不要求函式宣告使用extern,這可能有些令人遺憾,如果函式宣告也要求用extern,那麼形式上與變數宣告更加一致了,從而減少了混亂(但這就需要更多的輸入,這也許能解釋為什麼不要求函式宣告使用extern的原因)。

5.字元指標、浮點數指標、以及函式指標這三種型別的變數哪個占用的記憶體最大?為什麼?

答案:指標變數也占用記憶體單元,而且所有指標變數占用記憶體單元的數量都是相同的。就是說,不管是指向何種物件的指標變數,它們占用記憶體的位元組數都是一樣的,並且要足夠把程式中所能用到的最大位址表示出來(通常是乙個機器字長)。

6.同步機制應該遵循哪些基本準則?

1.空閒讓進 2.忙則等待3.有限等待4.讓權等待

7.各種型別32位或者64位的編譯器下所占用的位元組數

32位編譯器

char :1

個位元組char*

(即指標變數)

: 4個位元組(

32位的定址空間是

2^32,即32

個bit

,也就是

4個位元組。同理

64位編譯器)

short int : 2

個位元組int:4

個位元組unsigned int : 4

個位元組float:  4

個位元組double:   8

個位元組long:   4

個位元組long long:  8

個位元組unsigned long:  4

個位元組64

位編譯器

char :1

個位元組char*(

即指標變數

): 8

個位元組short int : 2

個位元組int:4

個位元組unsigned int : 4

個位元組float:  4

個位元組double:   8

個位元組long:   8

個位元組long long:  8

個位元組unsigned long:  8

個位元組 8.

char * getstr()

void main()

會輸出123嗎?123建立在堆上還是棧上呢?123的空間是什麼時候釋放的?

會,

"123" 

是常量字串,儲存在全域性變數區,和靜態變數一起。即不在堆,也不在棧

在程式結束時自動釋放

9.應用程式在執行時的記憶體包括**區和資料區,其中資料區又包括哪些部分?

參考:對於乙個程序的記憶體空間而言,可以在邏輯上分成

3個部份:**區,靜態資料區和動態資料區。動態資料區一般就是「堆疊」。棧是一種線性結構,堆是一種鏈式結構。程序的每個執行緒都有私有的「棧」。全域性變數和靜態變數分配在靜態資料區,本地變數分配在動態資料區,即堆疊中。程式通過堆疊的基位址和偏移量來訪問本地變數

10.用<<,>>,|,&實現乙個word(2個位元組)的高低位交換!!

int  main() 

結果是 cdab

2倆個位元組是16位 前八位為高位 後八位為低位 然後結合

11.寫出執行結果

int sum(int a)

void main()

}8,10,12,14,16

12.9:某程序在執行過程中需要等待從磁碟上讀入資料,此時程序的狀態將:c

a: 從就緒變為執行  b:從執行變為就緒

c: 從執行變為阻塞  d:從阻塞變為就緒

解析:

有關HTML的一些基礎知識

html hyper text markup language 超文字標記語言 標記 就是瀏覽器可以識別的文字和符號 目前常用的瀏覽器及它們的核心 1.chrome 谷歌 核心 webkit blink 2.firefox 火狐 核心 gecko 開源 3.ie 核心 trident 4.safar...

一些基礎知識

關於cd cd 返回剛才的位置 關於ls ls l,簡寫ll ls a顯示的檔案以.開頭,隱藏檔案 la al 關於cp cp r tmp dir 拷目錄 tmp拷到dir 需要加 r的 cp rm 10 13 1.grep 在乙個字元集合中找到符合條件的行輸出 如 grep hello file ...

一些基礎知識

linux基礎知識考查 1 在linux 系統中,以 檔案 方式訪問裝置 2 前台起動的程序使用 ctrl c 終止。3 在使用ls 命令時,用八進位制形式顯示非列印字元應使用引數 b 4 在linux 系統中,用來存放系統所需要的配置檔案和子目錄的目錄是 etc 5 在linux 系統中,壓縮檔案...