內容摘要:
1.static有什麼用途?(請至少說明兩種)
1)在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
2) 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所用函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
3) 在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用
2.引用與指標有什麼區別?
1) 引用必須被初始化,指標不必。
2) 引用初始化以後不能被改變,指標可以改變所指的對象。
3) 不存在指向空值的引用,但是存在指向空值的指標。
3.描述即時系統的基本特性
在特定時間內完成特定的任務,即時性與可靠性。
4.全域變數和局部變數在記憶體中是否有區別?如果有,是什麼區別?
全域變數儲存在待用資料庫,局部變數在堆棧。
5.什麼是平衡二叉樹?
左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大於1。
6.堆疊溢位一般是由什麼原因導致的?
沒有回收垃圾資源。
7.什麼函數不能聲明為虛函數?
constructor函數不能聲明為虛函數。
8.冒泡排序演算法的時間複雜度是什嗎?
時間複雜度是O(n^2)。
9.寫出float x 與“零值”比較的if語句。
if(x>0.000001&&x<-0.000001)
10.Internet採用哪種網路通訊協定?該協議的主要階層?
Tcp/Ip協議
主要階層為: 應用程式層/傳輸層/網路層/資料連結層/物理層。
11.Internet物理地址和IP地址轉換採用什麼協議?
ARP (Address Resolution Protocol)(位址解析協議)
12.IP地址的編碼分為哪倆部分?
IP地址由兩部分組成,網路號和主機號。不過是要和“子網路遮罩”按位與上之後才能區分哪些是網路位哪些是主機位。
13.使用者輸入M,N值,從1至N開始順序迴圈數數,每數到M輸出該數值,直至全部輸出。寫出C程式。
迴圈鏈表,用取餘操作做
14.不能做switch()的參數類型是:
switch的參數不能為實型。
15. C++程式由類和函數組成,模板也分為類模板(class template)和函數模板(function template).
函數模板與模板函數的區別是:函數模板是模板的定義,定義中用到通用型別參數.模板函數是實實在在的函數定義,它由編譯系統在遇到具體函數調用時所產生,具有程式碼.
同樣,在說明了一個類模板後,可以建立類模板的執行個體,即產生模板類.
16.純虛函數如何定義?使用時應注意什嗎?
virtual void f()=0;
是介面,子類必須要實現
17..數組和鏈表的區別
數組:資料順序儲存,固定大小
連表:資料可以隨機儲存,大小可動態改變
18. ISO的七層模型是什嗎?tcp/udp是屬於哪一層?tcp/udp有何優缺點?
應用程式層
展示層
會話層
運輸層
網路層
物理鏈路層
物理層
tcp /udp屬於運輸層
TCP 服務提供了資料流傳輸、可靠性、有效流量控制、全雙工系統操作和多工技術等。
與 TCP 不同, UDP 並不提供對 IP 協議的可靠機制、流量控制以及錯誤恢複功能等。由於 UDP 比較簡單, UDP 頭包含很少的位元組,比 TCP 負
載消耗少。
tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗餘性不好
udp: 不提供穩定的服務,包頭小,開銷小
19. 已知一個數組table,用一個宏定義,求出資料的元素個數
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
20. 線程與進程的區別和聯絡? 線程是否具有相同的堆棧? dll是否有獨立的堆棧?
進程是死的,只是一些資源的集合,真正的程式執行都是線程來完成的,程式啟動的時候作業系統就幫你建立了一個主線程。
每個線程有自己的堆棧。
DLL中有沒有獨立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL中的代碼是被某些線程所執行,只有線程擁有堆棧,
如果DLL中的代碼是EXE中的線程所調用,那麼這個時候是不是說這個DLL沒有自己獨立的堆棧?如果DLL中的代碼是由DLL自己建立的線程所執行
,那麼是不是說DLL有獨立的堆棧?
以上講的是堆棧,如果對於堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的記憶體,最好是從DLL中刪除,如果你從DLL中分配記憶體
,然後在EXE中,或者另外一個DLL中刪除,很有可能導致程式崩潰
21.關鍵字const是什麼含意?
我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裡完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著“唯讀”就可以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程式,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
1). 關鍵字const的作用是為給讀你代碼的人傳達非常有用的資訊,實際上,聲明一個參數為常量是為了告訴了使用者這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的資訊。(當然,懂得用const的程式員很少會留下的垃圾讓別人來清理的。)
2). 通過給最佳化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的代碼。
3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
22. 關鍵字volatile有什麼含意 並給出三個不同的例子。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,最佳化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在寄存器裡的備份。下面是volatile變數的幾個例子:
1). 平行裝置的硬體寄存器(如:狀態寄存器)
2). 一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
3). 多線程應用中被幾個任務共用的變數
回答不出這個問題的人是不會被僱傭的。我認為這是區分C程式員和嵌入式系統程式員的最基本的問題。嵌入式系統程式員經常同硬體、中斷、RTOS等等打交道,所用這些都要求volatile變數。不懂得volatile內容將會帶來災難。
假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
1). 一個參數既可以是const還可以是volatile嗎?解釋為什麼。
2). 一個指標可以是volatile 嗎?解釋為什麼。
3). 下面的函數有什麼錯誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1). 是的。一個例子是唯讀狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一個中服務子程式修該一個指向一個buffer的指標時。
3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
23、語句for( ;1 ;)有什麼問題?它是什麼意思?
答 、和while(1)相同。
24、do……while和while……do有什麼區別?
答 、前一個迴圈一遍再判斷,後一個判斷以後再迴圈
25.隊列和棧有什麼區別?
答 、隊列先進先出,棧後進先出
26. 對於一個頻繁使用的短小函數,在C語言中應用什麼實現,在C++中應用什麼實現?
答 、c用宏定義,c++用inline
27. 用兩個棧實現一個隊列的功能?要求給出演算法和思路!
答 、設2個棧為A,B, 一開始均為空白.
入隊:
將新元素push入棧A;
出隊:
(1)判斷棧B是否為空白;
(2)如果不為空白,則將棧A中所有元素依次pop出並push到棧B;
(3)將棧B的棧頂元素pop出;
這樣實現的隊列入隊和出隊的平攤複雜度都還是O(1), 比上面的幾種方法要好。
28.在c語言庫函數中將一個字元轉換成整型的函數是atool()嗎,這個函數的原型是什嗎?
答 、函數名: atol
功 能: 把字串轉換成長整型數
用 法: long atol(const char *nptr);
程式例:
#include
#include
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
30.局部變數能否和全域變數重名?
答:能,局部會屏蔽全域。要用全域變數,需要使用"::"
局部變數可以與全域變數同名,在函數內引用這個變數時,會用到同名的局部變數,而不會用到全域變數。對於有些編譯器而言,在同一個函
數內可以定義多個同名的局部變數,比如在兩個迴圈體內都定義一個同名的局部變數,而那個局部變數的範圍就在那個迴圈體內
31、如何引用一個已經定義過的全域變數?
答:extern
可以用引用標頭檔的方式,也可以用extern關鍵字,如果用引用標頭檔方式來引用某個在標頭檔中聲明的全域變理,假定你將那個變寫錯了,
那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在串連期間報錯
32、全域變數可不可以定義在可被多個.C檔案包含的標頭檔中?為什嗎?
答:可以,在不同的C檔案中以static形式來聲明同名全域變數。
可以在不同的C檔案中聲明同名的全域變數,前提是其中只能有一個C檔案中對此變數賦初值,此時串連不會出錯
33. 直接連結兩個信令點的一組鏈路稱作什麼?
PPP點到點串連
34. Heap與stack的差別。
Heap是堆,stack是棧。
Stack的空間由作業系統自動分配/釋放,Heap上的空間手動分配/釋放。
Stack空間有限,Heap是很大的自由儲存區
C中的malloc函數分配的記憶體空間即在堆上,C++中對應的是new操作符。
程式在編譯期對變數和函數分配記憶體都在棧上進行,且程式運行過程中函數調用時參數的傳遞也在棧上進行
35:const define的區別 關鍵回答出const編譯時間進行安全類型檢查。
兩者都可以定義常量,有專門的調試工具對const常量進行調試,宏常量沒調試工具
36:分配記憶體時為什麼記憶體不會重疊,地址分配是相對還是絕對的,這個我也說不清哦
記憶體位址是唯一的,邏輯地址和物理地址是不同的,記憶體不會重疊,
可能扯上:程式中記憶體配置有靜態分配(全域變數,靜態常量,編譯時間就分配好了);動態分配(用malloc,new分配);
棧上分配(局部變數);還有程式碼片段。
37:postmessage把訊息發送到訊息佇列就返回,sendmessage把訊息發送到訊息佇列處理完之後返回(許多人不知道哦,我未畢業面試時在這個問題上掛了次,後來又有次把它們說反了)
38:通訊方式有:訊號,訊號量,訊息佇列,共用記憶體
同步方法:訊號量,互斥量,事件,臨界區(這幾個區別?金山把我問趴了,如果你用過就應該清楚使用過程,可愛的金山沒了)
39:C++的socket和java的差不多,服務端:建立一個ServerSocket對象(server不是sever),之後註冊一個監聽類(不知道這說錯了沒啊),用accept()方法接收用戶端請求;用戶端:建立一個Socket對象,用send()方法發送資料。(應屆生說錯了末怪)
40:比如一個按鈕按下,就發送一條訊息,訊息發送到訊息佇列,訊息迴圈從訊息佇列中取出訊息分發到對應的視窗,由視窗函數處理。
(由視窗函數處理不知道錯了沒)
個人說法,錯了末叫,網上書上有的的答案。(回答了上面6個問題那公司就叫我去報道了。對了他首先問的是:你的C++基礎紮不紮實?紮實)
41. 和strcpy 的根本區別? C++:memset ,memcpy
#include "memory.h"
memset用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為‘ '或‘\0';例:char a[100];memset(a, '\0', sizeof(a));
memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料類型的對象,可以指定拷貝的資料長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的記憶體位址溢出。
strcpy就只能拷貝字串了,它遇到'\0'就結束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字串長度(第一個‘\0'之前)是否超過50位,如超過,則會造成b的記憶體位址溢出。
strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include
功能:把src所指由NULL結束的字串複製到dest所指的數組中。
說明:src和dest所指記憶體地區不可以重疊且dest必須有足夠的空間來容納src的字串。
返回指向dest的指標。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include
功能:由src所指記憶體地區複製count個位元組到dest所指記憶體地區。
說明:src和dest所指記憶體地區不能重疊,函數返回指向dest的指標。
Memset
原型:extern void *memset(void *buffer, char c, int count);
用法:#include
功能:把buffer所指記憶體地區的前count個位元組設定成字元c。
說明:返回指向buffer的指標。
42. 是幹什麼用的ASSERT()
ASSERT()是一個偵錯工具時經常使用的宏,在程式運行時它計算括弧內的運算式,如果運算式為FALSE (0), 程式將報告錯誤,並終止執行。如果運算式不為0,則繼續執行後面的語句。這個宏通常原來判斷程式中是否出現了明顯非法的資料,如果出現了終止程式以免導致嚴重後果,同時也便於尋找錯誤。例如,變數n在程式中不應該為0,如果為0可能導致錯誤,你可以這樣寫程式:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。
43 ("pause");系統的暫停程式,按任意鍵繼續,螢幕會列印,"按任意鍵繼續。。。。。" 省去了使用getchar();system
44. 請問C++的類和C裡面的struct有什麼區別?
c++中的類具有成員保護功能,並且具有繼承,多態這類oo特點,而c裡的struct沒有
45. 請講一講解構函式和虛函數的用法和作用?
解構函式也是特殊的類成員函數,它沒有傳回型別,沒有參數,不能隨意調用,也沒有重載。知識在類對象生命期結束的時候,由系統自動調用釋放在建構函式中分配的資源。這種在運行時,能依據其類型確認調用那個函數的能力稱為多態性,或稱遲後聯編。另:解構函式一般在對象撤消前做收尾工作,比如回收記憶體等工作,虛擬函數的功能是使子類可以用同名的函數對父類函數進行重載,並且在調用時自動調用子類重載函數,如果是純虛函數,則純粹是為了在子類重載時有個統一的命名而已。
46.請你詳細的解釋一下 IP 協議的定義,在哪個層上面,主要有什麼作用?
TCP 與 UDP
呢?
UDP
, TCP
在傳輸層, IP 在網路層,
TCP/IP 是英文
Transmission Control Protocol/Internet Protocol
的縮寫,意思是 " 傳輸控制通訊協定
/ 網際協議
" 。 TCP/IP
協議組之所以流行,部分原因是因為它可以用在各種各樣的通道和底層協議(例如
T1 和 X.25
、乙太網路以及 RS-232
串列介面)之上。確切地說, TCP/IP
協議是一組包括 TCP
協議和 IP
協議, UDP (
User Datagram Protocol
)協議、 ICMP (
Internet Control Message Protocol
)協議和其他一些協議的協議組。 TCP/IP
協議並不完全符合 OSI
的七層參考模型。傳統的開放式系統互連參考模型,是一種通訊協定的 7
層抽象的參考模型 ,
其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互連信。這 7
層是 :
物理層、資料連結層、網路層、傳輸層、話路層、展示層和應用程式層。而 TCP/IP
通訊協議採用了 4 層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這
4 層分別為:
應用程式層
:應用程式間溝通的層,如簡單電子郵件傳輸(
SMTP )、檔案傳輸通訊協定(
FTP )、網路遠端存取協議(
Telnet )等。
傳輸層
:在此層中,它提供了節點間的資料傳送服務,如傳輸控制通訊協定(
TCP )、使用者資料包通訊協定(
UDP )等, TCP
和 UDP
給資料包加入傳輸資料並把它傳輸到下一層中,這一層負責傳送資料,並且確定資料已被送達並接收。
互連網路層
:負責提供基本的資料封包傳送功能,讓每一塊資料包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(
IP )。
網路介面層
:對實際的網路媒體的管理,定義如何使用實際網路(如
Ethernet 、
Serial Line 等)來傳送資料。