大學(xué)生求職筆試C面試題_第1頁
大學(xué)生求職筆試C面試題_第2頁
大學(xué)生求職筆試C面試題_第3頁
大學(xué)生求職筆試C面試題_第4頁
大學(xué)生求職筆試C面試題_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

C語言面試題大匯總之華為面試題

silvers|01二月,200715:57

1、局部變量能否和全局變量重名?答:能,局部會屏蔽全局。要用全局變量,需要使

用"::"局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時,會用到同名的局部變

量,而不會用到全局變量。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部

變量,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用域就在那個

循環(huán)體內(nèi)。

2、如何引用一個已經(jīng)定義過的全局變量?答:extern可以用引用頭文件的方式,

也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假

定你將那個變寫錯了,那么在編譯期間會報借,如果你用extern方式引用時?,假定你犯了同

樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。

3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?答:可以,

在不同的C文件中以static形式來聲明同名全局變量??梢栽诓煌腃文件中聲明同

名的全局變量,前提是其中只能有一個C文件中時此變量賦初值,此時連接不會出錯

4、語句for(;1;)有什么問題?它是什么意思?答:和while(l)相同。

5、dowhile和whiledo有什么區(qū)別?答:前一個循環(huán)一遍再判斷,后一?"t"判

斷以后再循環(huán)

6、請寫出下列代碼的輸出內(nèi)容

#include

main()

(

inta,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printf("b,c,d:%d.%d,%d">b.c,d);

return0;

)

答:10,12,120

7、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)

別?static函數(shù)與普通函數(shù)有什么區(qū)別?全局變量(外部變量)的說明之前再冠以static

就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)

存儲方式。這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域

是整個源程序,當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都

是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在

同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),

只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。從以上分析

可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把

全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。static函數(shù)

與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)

(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說明和定義。對于可在當(dāng)前源文件以外使用的函數(shù),

應(yīng)該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件static全局變量

與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引

用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一

次依據(jù)上一次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一

份,普通函數(shù)在每個被調(diào)用中維持一份拷貝

8、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動態(tài)申請數(shù)據(jù)存在

于(堆)中。

9、設(shè)有以下說明和定義:

typedefunion

(

longi;intk[5];charc;}DATE;

structdata{intcat;DATEcow;doubledog;}too;

DATEmax;

則語句printf(n%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是:___52

答:DATE是一個union,變量公用空間.里面最大的變量類型是int⑸,占用20個字節(jié),所以

它的大小是20data是一個struct,每個變量分開占用空間.依次為int4+DATE20+double8=

32.所以結(jié)果是20+32=52.當(dāng)然…在某些16位編輯器下,int可能是2字節(jié),那么結(jié)果是

int2+DATE10+double8=20

10、隊列和棧有什么區(qū)別?隊列先進(jìn)先出,棧后進(jìn)先出

11>寫出下列代碼的輸出內(nèi)容

#include

intinc(inta){retum(++a);}intmulti(int*a,int*b,int*c)

{retum(*c=*a**b);}typedefint(FUNCl)(intin);typedef

int(FUNC2)(int*,int*,int*);voidshow(FUNC2fun,intargl,int*arg2)

{INCp=&inc;inttemp=p(argl);fun(&temp,&argl,arg2);

printf(',%dn',,*arg2);}main(){inta;show(multi,10,&a);

return0;}答:110

12、請找出下面代碼中的所以錯誤

說明:以下代碼是把一個字符串倒序,如“abed”倒序后變?yōu)椤癲cba”

#includeHstring.hM

main()

char*src=nhello,worldn;

char*dest=NULL;

intlen=strlen(src);

dest=(char*)malloc(len);

char*d=dest;

char*s=src[len];

while(len—!=0)

d++=s—;

printf(,,%s,',dest);

return0;

)

答:

方法1:

intmain()

char*src二"hello,world";

intlen=strlen(src);

char*dest=(char*)malloc(len+l);〃要為分配一個空間char*d=dest;

char*s=&src[len-l];〃指向最后一個字符

while(len—!=0)

*d++=*s--;

*d=0;〃尾部要加

printf("%sn",dest);

free(dest);〃使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露return0;

)

方法2:

#include<stdio.h>

#include<string.h>

main()

(

charstr[]=nhello,world";

intlen=strlen(str);

chart;

for(inti=0;i<len/2;i++)

(

t=str[i];

str[i]=str[len-i-l];str[len-i-l]=t;

)

printf("%sH,str);

return0;

)

13.對于一個頻繁使用的短小函數(shù),在C語言中應(yīng)用什么實現(xiàn),在C++中應(yīng)用什么實現(xiàn)?c

用宏定義,C++用inline

14.直接鏈接兩個信令點的一組鏈路稱作什么?PPP點到點連接

6.接入網(wǎng)用的是什么接口?

V5接口

16.voip都用了那些協(xié)議?H.323協(xié)議簇、SIP協(xié)議、Skype協(xié)議、H.248和MGCP協(xié)議

17.軟件測試都有那些種類?黑盒:針對系統(tǒng)功能的測試白合:測試函數(shù)功能,各

函數(shù)接口

18.確定模塊的功能和模塊的接口是在軟件設(shè)計的那個隊段完成的?概要設(shè)計階段

19.

enumstring

(

xl,

x2,

x3=10,

x4,

x5,

}x;

問x=0x801005,0x8010f4;

20.

unsignedchar*pl;

unsignedlong*p2;

pl=(unsignedchar*)0x801000;

p2=(unsignedlong*)0x810000;

請問pl+5=;

p2+5=;

選擇題:

21.Ethtemet鏈接到Internet用到以下那個協(xié)議?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID

22.屬于網(wǎng)絡(luò)層協(xié)議的是:A.TCP;B.IP;C.ICMP;D.X.2523.Windows消息調(diào)度機

制是:A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;

24.unsignedshorthash(unsignedshortkey)

{

return(key?)%256

)

請問hash(16),hash(256)的值分別是:

A.1.16;B.8.32;C.4.16;D.1.32

找錯題:

25.請問下面程序有什么錯誤?

inta[60][250][1000],i,j,k;

for(k=0;kMax_GT_Length)

{returnGT_Length_ERROR;

問答題:29.IPPhone的原理是什么?IPV6

30.TCP/IP通信建立的過程怎樣,端口有什么作用?三次握手,確定是哪個應(yīng)用程

序使用該協(xié)議

31.1號信令和7號信令有什么區(qū)別,我國某前廣泛使用的是那一種?

32.列舉5種以上的電話新業(yè)務(wù)

四.找錯題:

1.請問下面程序有什么錯誤?

inta[60J[250J[1000J,i,j,k;

for(k=0;k<=1000;k++)

for(j=0;j<250;j++)

for(i=0;i<60;i++)

a[i]Ul[k]=0;

把循環(huán)語句內(nèi)外換一下

2.#defineMax_CB500

voidLmiQueryCSmd(StructMSgCB*pmsg)

unsignedcharucCmdNum;

for(ucCmdNum=O;ucCmdNum<Max_CB;ucCmdNum++)

死循環(huán)

3.以下是求一個數(shù)的平方的程序,請找出錯誤:

#defineSQUARE(a)((a)*(a))

inta=5;

intb;

b=SQUARE(a++);

4.typedefunsignedcharBYTE

intexamply_fun(BYTEgt_len;BYTE*gt_code)

(

BYTE*gt_buf;

gt_buf=(BYTE*)MALLOC(Max_GT_Length);

if(gt_len>Max_GT_Length)

(■

returnGT_Length_ERROR;

五.問答題:

LIPPhone的原理是什么?

IPV6

2.TCP/IP通信建立的過程怎樣,端口有什么作用?

三次握手,確定是哪個應(yīng)用程序使用該協(xié)議

3.1號信令和7號信令有什么區(qū)別,我國某前廣泛使用的是那一種?

4.列舉5種以上的電話新業(yè)務(wù)?

微軟亞洲技術(shù)中心的面試題!!!

1.進(jìn)程和線程的差別。

線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實體.

與進(jìn)程的區(qū)別:

(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位

(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個進(jìn)程的多個線程之間也可并發(fā)

執(zhí)行

(3)擁有資源:進(jìn)程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以

訪問隸屬于進(jìn)程的資源.

(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致

系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。

2.測試方法

人工測試:個人復(fù)查、抽查和會審

機器測試:黑盒測試和白盒測試

2.Heap與stack的差別。

Heap是堆,stack是棧。

Stack的空間由操作系統(tǒng)自動分配/釋放,Heap上的空間手動分配/釋放。

Stack空間有限,Heap是很大的自由存儲區(qū)

C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對應(yīng)的是new操作符。

程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,目程序運行過程中函數(shù)調(diào)用

時參數(shù)的傳遞也在棧上進(jìn)行

3.Windows下的內(nèi)存是如何管理的?

4.介紹.Net和.Net的安全性。

5.客戶端如何訪問.Net組件實現(xiàn)WebService?

6.C/C++編譯器中虛表是如何完成的?

7.談?wù)凜OM的線程模型。然后討論進(jìn)程內(nèi)/外組件的差別。

8.談?wù)処A32下的分頁機制

小頁(4K)兩級分頁模式,大頁(4M)一級

9.給兩個變量,如何找出一個帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的?

一個遞增一,一個遞增二,他們指向同一個接點時就是環(huán)出現(xiàn)的地方

10.在IA32中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)?

通過調(diào)用門,從方叫3至1」日期0,中斷從ring3至UringO,進(jìn)入vm86等等

11.如果只想讓程序有一個實例運行,不能運行兩個。像winamp一樣,只能開

一個窗口,怎樣實現(xiàn)?

用內(nèi)存映射或全局原子(互斥變量)、查找窗口句柄..

FindWindow,互斥,寫標(biāo)志到文件或注冊表,共享內(nèi)存。.

12.如何截取鍵盤的響應(yīng),讓所有的‘a(chǎn)‘變成'b'?

鍵盤鉤子SetWindowsHookEx

13.Apartment在COM中有什么用?為什么要引入?

14.存儲過程是什么?有什么用?有什么優(yōu)點?

我的理解就是一堆sql的集合,可以建立非常復(fù)雜的查詢,編譯運行,所以運行

一次后,以后再運行速度比單獨執(zhí)行SQL快很多

15.Template有什么特點?什么時候用?

16.談?wù)刉indowsDNA結(jié)構(gòu)的特點和優(yōu)點。

17.網(wǎng)絡(luò)編程中設(shè)計并發(fā)服務(wù)器,使用多進(jìn)程與多線程,請問有什么區(qū)別?

1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)

制品。

2,線程:相對與進(jìn)程而言,線程是一個更加接近與執(zhí)行體的概念,它可以與同

進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨立的執(zhí)行序列。

兩者都可以提高程序的并發(fā)度,提高程序運行效率和響應(yīng)時間。

線程和進(jìn)程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保護(hù);

而進(jìn)程正相反。同時,線程適合于在SMP機器上運行,而進(jìn)程則可以跨機器遷

移。

思科

1.用宏定義寫出swap(x,y)

#defineswap(x,y)

x=x+y;

y=x-y;

X=x-y;

2.數(shù)組a[N],存放了1至N?1個數(shù),其中某個數(shù)重復(fù)一次。寫一個函數(shù),找出被

重復(fù)的數(shù)字,時間復(fù)雜度必須為。(N)函數(shù)原型:

intdo_dup(inta[]9intN)

3一語而實現(xiàn)x是否為2的若干次第的判斷

inti=512;

cout?boolalpha?((i&(i-1))?false:true)?endl;

4.unsignedintintvert(unsignedintx,intp,intn)實現(xiàn)對x的進(jìn)行轉(zhuǎn)換,p為起始轉(zhuǎn)

化位,n為需要轉(zhuǎn)換的長度,假設(shè)起始點在右邊.如x=0b00010001,p=4,n=3轉(zhuǎn)換后

x=0b01100001

unsignedintintvert(unsignedintx,intp,intn){

unsignedint_t=0;

unsignedint_a=1;

for(inti=0;i<n;++i){

_t1=_a;

_a=_a?1;

)

_t=__t?p;

xA=_t;

returnx;

)

慧通:

1.什么是預(yù)編譯,何時需要預(yù)編譯:

1、總是使用不經(jīng)常改動的大型代碼體。

2、程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選

項。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。

2.上述三個有什么區(qū)別?

char*constp;

charconst*p

constchar*p

解答:

char*constp;〃常量指針,p的值不可以修改

charconst*p;〃指向常量的指針,指向的常量值不可以改

constchar*p;〃和charconst*p

3.解釋下列輸出結(jié)果

charstrl[]="abc";

charstr2[]="abc";

constcharstr3[]="abc";

constcharstr4[]="abc”;

constchar*str5=HabcM;

constchar*str6="abc";

char*str7="abc”;

char*str8="abc”;

cout?(strl==str2)?endl;

cout?(str3==str4)?endl;

cout?(str5==str6)?endl;

cout?(str7==str8)?endl;

結(jié)果是:0011

解答:strl,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;

而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。

4.以下代碼中的兩個sizeof用法有問題嗎?[C易]

voidUpperCase(charstr[])〃將str中的小寫字母轉(zhuǎn)換成大寫字母

(

for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)

if(,a,<=str[i]&&str[i]<=,z,)

str[i]-=);

)

charstr[J=naBcDeH;

cout?"str字符長度為:"?sizeof(str)/sizeof(str[OJ)?endl;

UpperCase(str);

cout?str?endl;

答:函數(shù)內(nèi)的sizeof有問題。根據(jù)語法,sizeof如用于數(shù)組,只能測出靜態(tài)數(shù)組

的大小,無法檢測動態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個靜態(tài)定義的

數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實際只是一個指向字符串的指針,沒有任何

額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個指針為4

個字節(jié),因此返回4。

4.一個32位的機器,該機器的指針是多少位

指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機子都是32的數(shù)據(jù)總

線。所以指針的位數(shù)就是4個字節(jié)了。

5.指出下面代碼的輸出,并解釋為什么。

main()

(

inta[5]={1,2,3,4,5};

int*ptr=(int*)(&a+l);

printf(H%d,%dn,*(a+l),*(ptr-l));

)

輸出:2,5

*(a+l)就是a[l],*(ptr-l)就是a[4],執(zhí)行結(jié)果是2,5

&a+l不是首地址+1,系統(tǒng)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大

小(本例是5個int)

int*ptr=(int*)(&a+l);

則ptr實際是&(a[5]),也就是a+5

原因如下:

&a是數(shù)組指針,其類型為int(*)[5];

而指針加1要根據(jù)指針類型加上一定的值,

不同類型的指針+1之后增加的大小不同

a是長度為5的int數(shù)組指針,所以要加5*sizeof(int)

所以ptr實際是a[5]

但是prt與(&a+l)類型是不一樣的(這點很重要)

所以prt-1只會減去sizeof(int*)

a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a

是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[l],&a+l是下一個對象

的地址,即a⑸.

6.請問以下代碼有什么問題:

1).

intmain()

(

chara;

char*str=&a;

strcpy(str,"hello");

printf(str);

return0;

)

沒有為str分配內(nèi)存空間,將會發(fā)生異常

問題出在將一個字符串復(fù)制進(jìn)一個字符變量指針?biāo)傅刂贰km然可以正確輸出結(jié)

果,但因為越界進(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。

2).

char*s="AAA";

printf("%s",s);

s[OJ='B';

printf("%s",s);

有什么錯?

"AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有

問題。

cosntchar*s="AAA”;

然后又因為是常量,所以對是s[0]的賦值操作是不合法的。

1、寫一個“標(biāo)準(zhǔn)”宏,這個宏輸入兩個參數(shù)并返回較小的一個。

"defineMin(X,Y)((X)>(Y)?(Y):(X))〃結(jié)尾沒有;

2、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么用C編寫死循環(huán)。

while⑴[}或者for(;;)

3、關(guān)鍵字static的作用是什么?

定義靜態(tài)變量

4、關(guān)鍵字const有什么含意?

表示常量不可以修改的變量。

5、關(guān)鍵字volatile有什么含意?并舉出三個不同的例子?

提示編譯器對象的值可能在編譯器耒監(jiān)測到的情況下改變。

6.int(*s[10])(int)表示的是什么啊

int(*s[10])(int)函數(shù)指針數(shù)組,每個指針指向一個intfunc(intparam)的函數(shù)。

1.有以下表達(dá)式:

inta=248;b=4;intconstc=21;constint*d=&a;

int*conste=&b;intconst*fconst=&a;

請問下列表達(dá)式哪些會被編譯器禁止?為什么?

*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;

*c這是個什么東東,禁止

*d說了是const,禁止

e=&a說了是const禁止

const*fconst=&a;禁止

2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;

有兩種解法,一種用算術(shù)算法,一種用人(異或)

a=a+b;

b=a-b;

a=a-b;

or

a=a”;〃只能對int,char..

b=aAb;

a=aAb;

or

aA=bA=a;

3.c和C++中的struct有什么不同?

c和C++中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而C++中的struct

可以。C++中struct和class的主要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為

public,而class默認(rèn)為private

4.#inciude<stdio.h>

#include<stdlib.h>

voidgetmemory(char*p)

{

p=(char*)malloc(lOO);

strcpy(p,Hhelloworld");

)

intmain()

(

char*str=NULL;

getmemory(str);

printf(”%s/n”,str);

free(str);

return0;

)

程序崩潰,getmemory中的malloc不能返回動態(tài)內(nèi)存,free()對str操作很危險

5.charszstr[10];

strcpy(szstr,nO123456789*');

產(chǎn)生什么結(jié)果?為什么?

長度不一樣,會造成非法的OS

6.列舉幾種進(jìn)程的同步機制,并比較其優(yōu)缺點。

原子操作

信號量機制

自旋鎖

管程,會合,分布式系統(tǒng)

7.進(jìn)程之間通信的途徑

共享存儲系統(tǒng)

消息傳遞系統(tǒng)

管道:以文件系統(tǒng)為基礎(chǔ)

8.

一般分類::評論(41)::靜態(tài)鏈接網(wǎng)址::引用(0)

面試經(jīng)典試題

silvers|02一月,200711:41

面試經(jīng)典試題

Author:Vince

即使你是個編程高手,你在面試前也應(yīng)該要看看這套題,

她也許會給你帶來好運,否則你有可能后悔當(dāng)初為什么沒有看而跳樓

自殺,這樣我會很內(nèi)疚的。這套題看似簡單,但你未必能得高分,即

使你看不懂也要把她背下來!

歡迎轉(zhuǎn)載此文,轉(zhuǎn)載時請注明文章來源:文斯測試技術(shù)研究中心

http://blog.csdn?net/vincetest

1編程基礎(chǔ)

1.1基本概念

1.const的理解:constchar*,charconst*,char*const的區(qū)別問題幾乎是C++面試中每

次都會有的題目。事實上這個概念誰都有只是三種聲明方式非常相似很容易記

混。Bjarne在他的TheC++ProgrammingLanguage里面給出過一個助記的方法:

把一個聲明從右向左讀。

char*constcp;(*讀成pointerto)

cpisaconstpointertochar

constchar*p;

pisapointertoconstchar;

charconst*p;

同上因為C++里面沒有const*的運算符,所以const只能屬于前面的類型

2.c指針

int*p[n];——指針數(shù)組,每個元素均為指向整型數(shù)據(jù)的指針。

int(*)p[n]:p為指向一維數(shù)組的指針,這個一?維數(shù)組有n個整型數(shù)據(jù)。

int*p();函數(shù)帶回指針,指針指向返回的值。

int(*)p();p為指向函數(shù)的指針。

3.數(shù)組越界問題

下面這個程序執(zhí)行后會有什么錯誤或者效果:

#defineMAX255

intmain()

(

unsignedcharA[MAX],i;

for(i=0;i<=MAX;i++)

A[i]=i;

)

解答:MAX=255,數(shù)組A的下標(biāo)范圍為O.MAX-l,這是其一淇二當(dāng)i循環(huán)到255

時,循環(huán)內(nèi)執(zhí)行:A[255]=255;這句本身沒有問題,但是返回for(i=0;i<=MAX:i++)

語句時,由于unsignedchar的取值范圍在(O..255),i++以后i又為0了..無限循環(huán)下

去.

注:char類型為一個字節(jié),取值范圍是[-128,127],unsignedchar[0,255]

4.C++:memset,memcpy和strcpy的根本區(qū)別?

#include"memory.h"

memset用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進(jìn)

行初始化為或";例:chara(100];memset(a,",sizeof(a));

memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝

的數(shù)據(jù)長度;例:chara[100],b[50];memcpy(b,a,sizeof(b));注意如用sizeof(a),

會造成b的內(nèi)存地址溢出。

strcpy就只能拷貝字符串了,它遇到"就結(jié)束拷貝;例:chara[100],b[50];strcpy(a,b);

如用strcpy(b,a),要注意a中的字符串長度(第一個“之前)是否超過50位,如超

過,則會造成b的內(nèi)存地址溢出。

strcpy

原型:externchar*strcpy(char*dest,char*src);

用法:#include

功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。

說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src

的字符串。

返回指向dest的指針。

memcpy

原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);

用法:#include

功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。

說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。

Memset

原型:externvoid*memset(void*buffer,charc,intcount);

用法:#include

功能:把buffer所指內(nèi)存區(qū)域的前count個字節(jié)設(shè)置成字符c。

說明:返回指向buffer的指針。

5.ASSERT。是干什么用的

ASSERT。是一個調(diào)試程序時經(jīng)常使用的宏,在程序運行時它計算括號內(nèi)的表達(dá)

式,如果表達(dá)式為FALSE(0),程序?qū)蟾驽e誤,并終止執(zhí)行。如果表達(dá)式不為0,

則繼續(xù)執(zhí)行后面的語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)

據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時也便于查找錯誤。例如,變量

n在程序中不應(yīng)該為0,如果為0可能導(dǎo)致錯誤,你可以這樣寫程序:

ASSERT(n!=0);

k=10/n;

ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。

assert。的功能類似,它是ANSIC標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個重要

區(qū)別是可以用在Release版本中。

6.system("pause");系統(tǒng)的暫停程序,按任意鍵繼續(xù),屏幕會打印,"按任意鍵繼

續(xù)。。。?!笆∪チ耸褂胓etchar();

7.請問C++的類和C里面的struct有什么區(qū)別?

C++中的類具有成員保護(hù)功能,并且具有繼承,多態(tài)這類。。蹣,而c里的struct

沒有

8.請講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?

析構(gòu)函數(shù)也是特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào)用,

也沒有重載。知識在類對象生命期結(jié)束的時候,由系統(tǒng)自動調(diào)用釋放在構(gòu)造函數(shù)

中分配的資源。這種在運行時,能依據(jù)其類型確認(rèn)調(diào)用那個函數(shù)的能力稱為多態(tài)

性,或稱遲后聯(lián)編。另:析構(gòu)函數(shù)一般在對象撤消前做收尾工作,比如回收內(nèi)存

等工作,虛擬函數(shù)的功能是使子類可以用同名的函數(shù)對父類函數(shù)進(jìn)行重載,并且

在調(diào)用時自動調(diào)用子類重載函數(shù),如果是純虛函數(shù),則純粹是為了在子類重載時

有個統(tǒng)--的命名而已。

9.全局變量和局部變量有什么區(qū)別?實怎么實現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道

的?

全局變量的生命周期是整個程序運行的時間,而局部變量的生命周期則是局部函

數(shù)或過程調(diào)用的時間段。其實現(xiàn)是由編譯器在編譯時采用不同內(nèi)存分配方法。全

局變量在main函數(shù)調(diào)用后,就開始分配,如果是靜態(tài)變量則是在main函數(shù)前就

已經(jīng)初始化了。而局部變量則是在用戶棧中動態(tài)分配的(還是建議看編譯原理中

的活動記錄這--塊)

10.8086是多少尉的系統(tǒng)?在數(shù)據(jù)總線上是怎么實現(xiàn)的?

8086系統(tǒng)是16位系統(tǒng),其數(shù)據(jù)總線是20位。

1.2程序設(shè)計

1.編寫用C語言實現(xiàn)的求n階階乘問題的遞歸算法:

longintfact(intn)

{

intx;

longinty;

if(n<0)

(

printf("error!〃);

)

if(n=0)

return1;

x=n-l;

y=fact(x);

return(n*y);

}

2.二分查找算法:

1)遞歸方法實現(xiàn):

intBSearch(elemtypea[],elemtypex,intlow,inthigh)

/*在下屆為low,上界為high的數(shù)組a中折半查找數(shù)據(jù)元素x*/

(

intmid;

if(low>high)return-1;

mid=(low+high)/2;

if(x==a[mid])returnmid;

if(x<a[mid])return(BSearch(a,x,low,mid-1));

elsereturn(BSearch(a,x,mid+1,high));

)

2)非遞歸方法實現(xiàn):

intBSearch(elemtypea[],keytypekey,intn)

(

intlow,high,mid;

low=0;high=n-l;

while(low<=high)

(

mid=(low+high)/2;

if(a[mid].key=key)returnmid;

elseif(a[mid].key<key)low=mid+1;

elsehigh=midT;

)

return-1;

)

3.遞歸計算如下遞歸函數(shù)的值(斐波拉契):

f⑴=1

f⑵=1

f(n)=f(n-l)+f(n-2)n>2

解:

intf(intn)

(

inti,s,si,s2;

sl=l;/*sl用于保存f(n-1)的值*/

s2=l;/*s2用于保存f(n-2)的值*/

s=l;

for(i=3;i<=n;i++)

(

s=sl+s2;

s2=sl;

sl=s;

}

return(s);

4.交換兩個數(shù),不用第三塊兒內(nèi)存:

inta=…

intb=???

a=a+b;

b=a-b;

a=a-b;

5.冒泡排序:

voidBubbleSort(elemtypex[],intn)

inti,j;

elemtypetemp;

for(i=l;i<n;i++)

for(j=0;j<n-i;j++)

(

if(x[j].key>x[j+l].key)

(

temp=x[j];

x[j]=x[j+l];

x[j+l]=temp;

)

)

)

6.c語言文件讀寫

^include"stdio.h〃

mainO

FILE*fp;

charch,filename[10];

scanf("%s〃,filename);

if((fp=fopen(filename,〃w")=NULL)

{

printf(,,cann,topenfilen〃);

exit(0);

)

ch=getchar();

while(ch!=,#')

(

fputc(ch,fp);

putchar(ch);

ch=getchar();

)

fclose(fp);

)

7.winsocket編程

#include<Winsock2.h>

^include<stdio.h>

voidmain()

(

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err二WSAStartup(wVersionRequested,fewsaData);

if(err!=0)

(

return;

)

if(L0BYTE(wsaData.wVersion)!=11|

HIBYTE(wsaData.wVersion)!=1)

(

WSACleanupO;

return;

)

SOCKETsockSrv=socket(AF」NET,SOCK_STREAM,0);

SOCKADDR_INaddrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_INaddrClient;

intlen=sizeof(SOCKADDR);

while(l)

SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

charsendBuf[100];

sprint(sendBuf,,zWelcome%stohttp:〃www.sunxin.

inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

charrecvBuf[100];

recv(sockConn,recvBuf);

printf(〃%sn〃,recvBuf);

closesocket(sockConn);

WSACleanupO;

)

)

注:這是Server端;File->New->Win32ConsoleApplication,工程名:TcpSrv;

然后,F(xiàn)ile->New->C++SourceFile,文件名:TcpSrv;在該工程的Setting的Link

的Object/librarymodules項要加入ws2_32.1ib

ttinclude<Winsock2.h>

^include<stdio.h>

voidmainO

(

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0)

(

return;

)

if(LOBYTE(wsaData.wVersion)!=1||

HIBYTE(wsaData.wVersion)!=1)

(

WSACleanupO;

return;

)

SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_INaddrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addrC'〃);

addrSrv.sin_family=AF_INET;

addrSrv.sin_porthtons(6000);

connect(sockClient,(S0CKADDR*)&addrSrv,sizeof(SOCKADDR));

charrecvBuf[100];

recv(sockClient,recvBuf,100,0);

printf(〃%sn〃,recvBuf);

send(sockClient,z,Thisiszhangsan”,strlen("Thisiszhangsan")+1,0);

closesocket(sockClient);

WSACleanupO;

)

注:這是Client端;File->New->Win32ConsoleApplication,工程名:TcpClient;然后,

File->New->C++SourceFile,文件名:TcpClient;同理,在該工程的Setting的Link

的Object/librarymodules項要加入ws2_32.lib

8.類的知識

C++

ttinclude<iostream.h>

classhuman

(

public:

human(){humannum++;);

staticinthuman_num;

"human()

{

human_num一;

print();

)

voidprint()

(

cout<<,zhumannumis:,z<<human_num<<endl;

}

protected:

private:

);

inthuman::humannum=0;

humanfl(humanx)

(

x.print();

returnx;

)

intmain(intargc,char*argv[])

(

humanhl;

hl.print();

humanh2=fl(hl);

h2.print();

return0;

)

輸出:

1

1

0

0

-1

-2

分析:

humanhl;〃調(diào)用構(gòu)造函數(shù),hum_num=1;

hl.print。;〃輸出:"humanis1"

humanh2=fl(hl);〃再調(diào)用fl(hl)的過程中,由于函數(shù)參數(shù)是按值傳遞對象,調(diào)用

默認(rèn)的復(fù)制構(gòu)造函數(shù),?股分類::評論(9)::靜態(tài)鏈接網(wǎng)址::引用(0)

C/C++程序設(shè)計員應(yīng)聘常見面試試題深入剖析

silvers|25九月,200609:07

本文的寫作目的并不在于提供C/C++程序員求職面試指導(dǎo),而旨在從技術(shù)上分析面試題的內(nèi)

涵。文中的大多數(shù)面試題來自各大論壇,部分試題解答也參考了網(wǎng)友的意見。

許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業(yè)要求面試者寫一

個最簡單的strcpy函數(shù)都可看出面試者在技術(shù)上究竟達(dá)到了怎樣的程度,我們能真正寫好一

個strcpy函數(shù)嗎?我們都覺得自己能,可是我們寫出的strcpy很可能只能拿到10分中的2分。

讀者可從本文看到strcpy函數(shù)從2分到10分解答的例子,看看自己屬于什么樣的層次。止匕外,

還有一些面試題考查面試者敏捷的思維能力。

分析這些面試題,本身包含很強的趣味性:而作為?名研發(fā)人員,通過對這些面試題的

深入剖析則可進(jìn)一步增強自身的內(nèi)功。

2.找錯題

試題1:

voidtest1()

charstringllOJ;

char*strl="0123456789";

strcpy(string,strl);

試題2:

voidtest2()

charstringl10|,strl110|;

inti;

for(i=0;i<10;i++)

(

strl[i]='a';

}

strcpy(string,strl);

)

試題3:

voidtest3(char*strl)

(

charstring[10|;

if(strlen(strl)<=10)

(

strcpy(string,strl);

}

)

解答:

試題1字符串strl需要11個字節(jié)才能存放下(包括末尾的‘‘),而string只有10個字節(jié)

的空間,strcpy會導(dǎo)致數(shù)組越界;

對試題2,如果面試者指出字符數(shù)組strl不能在數(shù)組內(nèi)結(jié)束可以給3分;如果面試者指

出strcpy(string,strl)調(diào)用使得從strl內(nèi)存起復(fù)制到string內(nèi)存起所復(fù)制的字節(jié)數(shù)具有不確定

性可以給7分,在此基礎(chǔ)上指出庫函數(shù)strcpy工作方式的給10分;

對試題3,if(strlen(strl)<=10)應(yīng)改為if(strlen(strl)<10),因為strlen的結(jié)果未統(tǒng)計”所

占用的1個字節(jié)。

剖析:

考查對基本功的掌握:

(1)字符串以"結(jié)尾;

(2)對數(shù)組越界把握的敏感度;

(3)庫函數(shù)strcpy的工作方式,如果編寫一個標(biāo)準(zhǔn)strcpy函數(shù)的總分值為10,下面給出

幾個不同得分的答案:

2分

voidstrcpy(char*strDest,char*strSrc)

(

while((*strDest++=*strSrc-H-)!=’‘);

)

4分

voidstrcpy(char*strDest,constchar*strSrc)

〃將源字符串加const,表明其為輸入?yún)?shù),力口2分

(

while((*strDest++=*strSrc++)!=°);

)

7分

voidstrcpy(char*strDest,constchar*strSrc)

(

〃對源地址和目的地址加非0斷言,加3分

assert((strDest!=NULL)&&(strSrc!=NULL));

while((*strDest++=*strSrc++)!=");

)

10分

〃為了實現(xiàn)鏈?zhǔn)讲僮?,將目的地址返回,力?分!

char*strcpy(char*strDest,constchar*strSrc)

(

assert((strDest!=NULL)&&(strSrc!=NULL));

char*address=strDest;

while((*strDest++=*strSrc++)!=°);

returnaddress;

從2分到10分的幾個答案我們可以清楚的看到,小小的strcpy竟然暗臧著這么多玄機,

真不是蓋的!需要多么扎實的基本功才能寫一個完美的strcpy啊!

(4)對strlen的掌握,它沒有包括字符串末尾的”。

讀者看了不同分值的strcpy版本,應(yīng)該也可以寫出一個10分的strlen函數(shù)了,完美的

版本為:intstrlen(constchar*str)〃輸入?yún)?shù)const

(

assert(strt!=NULL);〃斷言字符串地址非0

intlen;

while((*str++)!=*')

(

len++;

)

returnlen;

試題4:

voidGetMemory(char*p)

(

p=(char*)malloc(100);

)

voidTest(void)

(

char*str=NULL;

GetMemory(str);

strcpy(str,"helloworld'1);

printf(str);

)

試題5:

char*GetMemory(void)

(

charp[]="helloworld";

returnp;

)

voidTest(void)

char*str=NULL;

str=GetMemoryO;

printf(str);

試題6:

voidGetMemory(char**p,intnum)

(

*p=(char*)malloc(num);

)

voidTest(void)

(

char*str=NULL;

GetMemory(&str,100);

strcpy(str,"hello”);

printf(str);

)

試題7:

voidTest(void)

(

char*str=(char*)malloc(100);

strcpy(str,"hello");

free(str);

…〃省略的其它語句

)

解答:

試題4傳入中GetMemory(char*p)函數(shù)的形參為字符串指針,在函數(shù)內(nèi)部修改形參并

不能真正的改變傳入形參的值,執(zhí)行完

char*str=NULL;

GetMemory(str);

后的str仍然為NULL;

試題5中

charp[]="helloworld";

returnp;

的p[]數(shù)組為函數(shù)內(nèi)的局部自動變量,在函數(shù)返回后,內(nèi)存已經(jīng)被釋放。這是許多程序

員常犯的錯誤,其根源在于不理解變量的生存期。

試題6的GetMemory避免了試題4的問題,傳入GetMemory的參數(shù)為字符串指針的指

針,但是在GetMemory中執(zhí)行申請內(nèi)存及賦值語句

*p=(char*)malloc(num);

后未判斷內(nèi)存是否申請成功,應(yīng)加上:

if(*p=NULL)

(

…〃進(jìn)行申請內(nèi)存失敗處理

)

試題7存在與試題6同樣的問題,在執(zhí)行

char*str=(char*)malloc(100);

后未進(jìn)行內(nèi)存是否申請成功的判斷;另外,在free(str)后未置str為空,導(dǎo)致可能變成一

個“野”指針,應(yīng)加上:

str=NULL;

試題6的Test函數(shù)中也未對malloc的內(nèi)存進(jìn)行釋放。

剖析:

試題4?7考查面試者對內(nèi)存操作的理解程度,基本功扎實的面試者一般都能正確的回

答其中50~60的錯誤。但是要完全解答正確,卻也絕非易事。

對內(nèi)存操作的考查主要集中在:

(1)指針的理解;

(2)變量的生存期及作用范圍;

(3)良好的動態(tài)內(nèi)存申請和釋放習(xí)慣。

再看看下面的一段程序有什么錯誤:

swap(int*pl,int*p2)

(

int*p;

*p=*pl;

*pl=*p2;

*p2=*p;

)

在swap函數(shù)中,p是一個“野”指針,有可能指向系統(tǒng)區(qū),導(dǎo)致程序運行的崩潰。在VC++

中DEBUG運行時提示錯誤"AccessViolation"。該程序應(yīng)該改為:

swap(int*pl,int*p2)

(

intp;

p=*pl;

*pl=*p2;

*p2=p;

)

3.內(nèi)功題

試題1:分別給出BOOL,int,float,指針變量與“零值”比較的if語句(假設(shè)變量名

為var)

解答:

BOOL型變量:if(!var)

int型變量:if(var==0)

float型變量:

constfloatEPSINON=0.00001;

if((x>=-EPSINON)&&(x<=EPSINON)

指針變量:if(var==NULL)

剖析:

考查對0值判斷的“內(nèi)功”,BOOL型變量的0判斷完全可以寫成if(va—O),而int型變

量也可以寫成if(!var),指針變量的判斷也可以寫成if(!var),上述寫法雖然程序都能正確運

行,但是未能清晰地表達(dá)程序的意思。

一般的,如果想讓if判斷一個變量的“真"、"假",應(yīng)直接使用if(var)、if(!var),表明其

為“邏輯”判斷;如果用if判斷一個數(shù)值型變量(short、int、long等),應(yīng)該用if(var==0),表

明是與0進(jìn)行“數(shù)值”上的比較;而判斷指針則適宜用if(var==NULL),這是一種很好的編程

習(xí)慣。

浮點型變量并不精確,所以不可將float變量用“=="或"!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化

成“>=”或“v=”形式。如果寫成if(x==0.0),則判為錯,得0分。

試題2:以下為WindowsNT下的32位C++程序,請計算sizeof的值

voidFunc(charstr[100])

(

sizeof(str)=?

)

void*p=malloc(100);

sizeof(p)=?

解答:

sizeof(str)=4

sizeof(p)=4

剖析:

Func(charstr[100])函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的

內(nèi)涵,僅僅只是一個指

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論