各大軟件公司c++面試題(ti)集合(he),找工作人的福(fu)利
時間:2018-08-02 來源(yuan):未知
對(dui)于(yu)很多(duo)(duo)找工作的(de)(de)(de)(de)人(ren)(ren)來說,面試(shi)是找工作的(de)(de)(de)(de)最(zui)重(zhong)要的(de)(de)(de)(de)一個環節,很多(duo)(duo)人(ren)(ren)都(dou)(dou)毀在了面試(shi)題上,今天在這里(li)我(wo)總(zong)結了個大公司的(de)(de)(de)(de)面試(shi)題,都(dou)(dou)是我(wo)去面試(shi)時做(zuo)的(de)(de)(de)(de)和我(wo)朋(peng)友做(zuo)的(de)(de)(de)(de),我(wo)都(dou)(dou)搜集整(zheng)理出來,希望可(ke)以幫到你。
1. 引用與指針(zhen)有什么(me)區(qu)別(bie)?
1) 引用必須(xu)被初始(shi)化,指針不必。
2) 引用初(chu)始化(hua)以后不能(neng)被改(gai)變,指針可以改(gai)變所指的(de)對(dui)象。
2) 不存在(zai)指(zhi)向(xiang)空值(zhi)(zhi)的(de)引(yin)用(yong),但是存在(zai)指(zhi)向(xiang)空值(zhi)(zhi)的(de)指(zhi)針(zhen)。
2. 描述實(shi)時系統的(de)基本特(te)性
在特定時(shi)間(jian)內完成特定的任務,實時(shi)性與(yu)可靠性
3. 全局變(bian)量和(he)局部(bu)變(bian)量在內存(cun)中是否(fou)有(you)區(qu)(qu)別?如(ru)果有(you),是什么(me)區(qu)(qu)別?
全局變(bian)(bian)量(liang)儲(chu)存在靜態(tai)數(shu)據庫,局部(bu)變(bian)(bian)量(liang)在堆棧
4. 什么是平衡二叉樹?
左右子樹(shu)都是平衡二叉樹(shu) 且左右子樹(shu)的(de)深度(du)差值的(de)絕對值不大于(yu)1
5. 堆(dui)棧(zhan)溢出一般是由(you)什么原因導致(zhi)的?
沒有回收(shou)垃(la)圾資源。
6. 什么函數不能聲明為虛函數
構(gou)造(zao)函(han)數(shu),友元(yuan)函(han)數(shu)
7. 冒泡(pao)排序算(suan)法的時間復雜(za)度是什么?
O(n^2)
8. 寫出(chu)float x 與“零值(zhi)”比較的if語(yu)句。
if(x〈0.000001&&x〉-0.000001)
9. Internet采(cai)用哪種(zhong)網絡協議?該協議的主要層次結構?
tcp/ip 應用(yong)層(ceng)(ceng)/傳輸(shu)層(ceng)(ceng)/網絡(luo)層(ceng)(ceng)/數據鏈路層(ceng)(ceng)/物理(li)層(ceng)(ceng)
10. Internet物理地址和(he)IP地址轉(zhuan)換采用(yong)什么協議?
ARP (Address Resolution Protocol)(地(di)址解析(xi)協議)
11.IP地址的編(bian)碼分(fen)為哪倆部分(fen)?
IP地址由兩部(bu)分組(zu)成(cheng),網(wang)絡(luo)號和主機號。不過是要和“子網(wang)掩碼”按位(wei)與上之(zhi)后才能區(qu)分哪些(xie)是網(wang)絡(luo)位(wei)哪些(xie)是主機位(wei)。
????月色夫(fu)環(huan)寫(xie)一下2.用戶輸(shu)(shu)(shu)入M,N值,從1至(zhi)N開始順序循(xun)環(huan)數(shu)數(shu),每數(shu)到M輸(shu)(shu)(shu)出(chu)該數(shu)值,直至(zhi)全部(bu)輸(shu)(shu)(shu)出(chu)。寫(xie)出(chu)C程序。
循(xun)環鏈表(biao),用取余操作做(zuo)
12.不(bu)能做switch()的參數類型是:
switch的參數不能為實型。
===========================================================================
華為
1、局部(bu)變量(liang)能否和全局變量(liang)重名?
答:能(neng),局(ju)部會(hui)屏蔽全局(ju)。要(yao)用全局(ju)變(bian)量(liang),需要(yao)使用"::"
局(ju)(ju)(ju)(ju)部變(bian)(bian)量(liang)可以與全局(ju)(ju)(ju)(ju)變(bian)(bian)量(liang)同(tong)(tong)名,在函數內(nei)引用(yong)這個(ge)變(bian)(bian)量(liang)時(shi),會用(yong)到(dao)同(tong)(tong)名的(de)(de)局(ju)(ju)(ju)(ju)部變(bian)(bian)量(liang),而不會用(yong)到(dao)全局(ju)(ju)(ju)(ju)變(bian)(bian)量(liang)。對于有些編(bian)譯器而言,在同(tong)(tong)一個(ge)函數內(nei)可以定義多個(ge)同(tong)(tong)名的(de)(de)局(ju)(ju)(ju)(ju)部變(bian)(bian)量(liang),比(bi)如(ru)在兩(liang)個(ge)循(xun)環體內(nei)都定義一個(ge)同(tong)(tong)名的(de)(de)局(ju)(ju)(ju)(ju)部變(bian)(bian)量(liang),而那(nei)個(ge)局(ju)(ju)(ju)(ju)部變(bian)(bian)量(liang)的(de)(de)作用(yong)域就在那(nei)個(ge)循(xun)環體內(nei)
?2、如何(he)引用一個已(yi)經定義過的全(quan)局(ju)變量?
答:extern可以(yi)(yi)用(yong)引用(yong)頭文(wen)件(jian)的(de)(de)方(fang)式,也(ye)可以(yi)(yi)用(yong)extern關鍵字,如(ru)果用(yong)引用(yong)頭文(wen)件(jian)方(fang)式來(lai)引用(yong)某個(ge)在(zai)頭文(wen)件(jian)中聲(sheng)明的(de)(de)全局變理,假定(ding)你將(jiang)那個(ge)變寫錯了,那么(me)在(zai)編(bian)譯(yi)期(qi)間(jian)會(hui)報(bao)錯,如(ru)果你用(yong)extern方(fang)式引用(yong)時,假定(ding)你犯了同樣(yang)的(de)(de)錯誤,那么(me)在(zai)編(bian)譯(yi)期(qi)間(jian)不會(hui)報(bao)錯,而在(zai)連接期(qi)間(jian)報(bao)錯
3、全局變量可(ke)不可(ke)以(yi)定義在(zai)可(ke)被多個.C文件包含的頭文件中?為什(shen)么(me)?
答:可(ke)以,在不(bu)同的(de)C文(wen)件中以static形式(shi)來聲明同名全局(ju)變(bian)量。
可以在不同的(de)C文件(jian)中聲明同名的(de)全(quan)局變(bian)量(liang),前提是其中只能有一個C文件(jian)中對此變(bian)量(liang)賦(fu)初值,此時連接不會出錯(cuo)
4、語句for( ;1 ;)有什(shen)么問(wen)題?它(ta)是什(shen)么意思?
答:和while(1)相同(tong)。
5、do……while和while……do有(you)什(shen)么區別?
答(da):前一(yi)個循(xun)環一(yi)遍再判斷(duan),后(hou)一(yi)個判斷(duan)以后(hou)再循(xun)環
6、請寫出(chu)下列代碼的輸出(chu)內容
#i nclude
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答:10,12,120
??1、static全(quan)局變(bian)(bian)量(liang)與普(pu)通的(de)全(quan)局變(bian)(bian)量(liang)有(you)什(shen)么區別?static局部(bu)(bu)變(bian)(bian)量(liang)和普(pu)通局部(bu)(bu)變(bian)(bian)量(liang)有(you)什(shen)么區別?static函數與普(pu)通函數有(you)什(shen)么區別?
全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)(外部(bu)變(bian)(bian)量(liang)(liang)(liang))的(de)(de)(de)(de)(de)說(shuo)明之(zhi)前再冠以static 就構成(cheng)了靜(jing)態(tai)(tai)的(de)(de)(de)(de)(de)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)。全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)本身就是靜(jing)態(tai)(tai)存(cun)儲(chu)(chu)方式(shi)(shi), 靜(jing)態(tai)(tai)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)當然也是靜(jing)態(tai)(tai)存(cun)儲(chu)(chu)方式(shi)(shi)。 這(zhe)兩者在(zai)存(cun)儲(chu)(chu)方式(shi)(shi)上并無(wu)不(bu)同(tong)。這(zhe)兩者的(de)(de)(de)(de)(de)區別雖(sui)在(zai)于非靜(jing)態(tai)(tai)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)的(de)(de)(de)(de)(de)作(zuo)用域是整個源程序, 當一個源程序由多個源文(wen)件(jian)組成(cheng)時,非靜(jing)態(tai)(tai)的(de)(de)(de)(de)(de)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)在(zai)各(ge)個源文(wen)件(jian)中(zhong)都是有效的(de)(de)(de)(de)(de)。 而靜(jing)態(tai)(tai)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)則限制了其作(zuo)用域, 即只(zhi)在(zai)定義該(gai)變(bian)(bian)量(liang)(liang)(liang)的(de)(de)(de)(de)(de)源文(wen)件(jian)內(nei)有效, 在(zai)同(tong)一源程序的(de)(de)(de)(de)(de)其它源文(wen)件(jian)中(zhong)不(bu)能(neng)使用它。由于靜(jing)態(tai)(tai)全(quan)(quan)局(ju)(ju)(ju)變(bian)(bian)量(liang)(liang)(liang)的(de)(de)(de)(de)(de)作(zuo)用域局(ju)(ju)(ju)限于一個源文(wen)件(jian)內(nei),只(zhi)能(neng)為該(gai)源文(wen)件(jian)內(nei)的(de)(de)(de)(de)(de)函數公用, 因(yin)此可以避免在(zai)其它源文(wen)件(jian)中(zhong)引起(qi)錯誤。
從以上分(fen)析(xi)可以看出(chu), 把局部變(bian)量(liang)(liang)改(gai)變(bian)為靜態變(bian)量(liang)(liang)后(hou)是改(gai)變(bian)了它的存儲方式即改(gai)變(bian)了它的生存期。把全局變(bian)量(liang)(liang)改(gai)變(bian)為靜態變(bian)量(liang)(liang)后(hou)是改(gai)變(bian)了它的作用(yong)(yong)域, 限制了它的使用(yong)(yong)范圍。
static函(han)數(shu)(shu)與(yu)普通函(han)數(shu)(shu)作用域不同。僅在(zai)(zai)(zai)本文(wen)(wen)件(jian)。只在(zai)(zai)(zai)當前源文(wen)(wen)件(jian)中(zhong)使用的(de)函(han)數(shu)(shu)應該(gai)(gai)說明(ming)為(wei)內部函(han)數(shu)(shu)(static),內部函(han)數(shu)(shu)應該(gai)(gai)在(zai)(zai)(zai)當前源文(wen)(wen)件(jian)中(zhong)說明(ming)和定義。對于可在(zai)(zai)(zai)當前源文(wen)(wen)件(jian)以外使用的(de)函(han)數(shu)(shu),應該(gai)(gai)在(zai)(zai)(zai)一(yi)個(ge)(ge)頭(tou)文(wen)(wen)件(jian)中(zhong)說明(ming),要使用這些(xie)函(han)數(shu)(shu)的(de)源文(wen)(wen)件(jian)要包含(han)這個(ge)(ge)頭(tou)文(wen)(wen)件(jian)
?static全局(ju)變(bian)量與普通的全局(ju)變(bian)量有(you)什(shen)么區別:static全局(ju)變(bian)量只(zhi)初使化一次(ci),防止(zhi)在其(qi)他文件單元(yuan)中被引用;
static局部(bu)(bu)變量和(he)普通局部(bu)(bu)變量有什么區別:static局部(bu)(bu)變量只被初始化一(yi)次,下(xia)一(yi)次依據上(shang)一(yi)次結果(guo)值;
static函(han)數(shu)與普通函(han)數(shu)有什(shen)么區(qu)別:static函(han)數(shu)在內(nei)存(cun)中(zhong)只有一份(fen),普通函(han)數(shu)在每個被(bei)調(diao)用中(zhong)維(wei)持一份(fen)拷貝
2、程(cheng)序的局部變(bian)量存在(zai)于(堆棧)中(zhong),全局變(bian)量存在(zai)于(靜(jing)態區 )中(zhong),動態申請數據存在(zai)于( 堆)中(zhong)。
3、設有以下說(shuo)明和定(ding)義:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
則語句 printf("%d",sizeof(struct date)+sizeof(max));的(de)執行結果是:___52____
答:DATE是一個(ge)union, 變量公(gong)用空間. 里面最大的(de)變量類型是int[5], 占用20個(ge)字節. 所以它的(de)大小(xiao)是20
data是一個struct, 每個變量分開(kai)占用空(kong)間. 依次為(wei)int4 + DATE20 + double8 = 32.
所以結果(guo)是(shi) 20 + 32 = 52.
當然...在某些(xie)16位編輯器下, int可(ke)能是2字(zi)節,那么結果(guo)是 int2 + DATE10 + double8 = 20
4、隊(dui)列和(he)棧有什么區別?
隊列(lie)先進先出,棧后進先出
5、寫出下(xia)列代碼(ma)的(de)輸出內容
#i nclude
int inc(int a)
{
return(++a);
}
int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{
INCp=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
答:110
7、請找出下面(mian)代碼中的所以錯誤
說明:以下代碼是把(ba)一個字符串倒(dao)序,如“abcd”倒(dao)序后變為(wei)“dcba”
1、#i nclude"string.h"
2、main()
3、{
4、 char*src="hello,world";
5、 char* dest=NULL;
6、 int len=strlen(src);
7、 dest=(char*)malloc(len);
8、 char* d=dest;
9、 char* s=src[len];
10、 while(len--!=0)
11、 d++=s--;
12、 printf("%s",dest);
13、 return 0;
14、}
答:
方法1:
int main(){
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要為\0分配一(yi)個空間
char* d = dest;
char* s = &src[len-1];//指向最后一個字(zi)符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部(bu)要加\0
printf("%s\n",dest);
free(dest);// 使用(yong)完,應(ying)當釋放空間,以免(mian)造成內存匯泄(xie)露
return 0;
}
方法2:
#i nclude
#i nclude
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i
{
t=str[i];
str[i]=str[len-i-1];
str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
1.-1,2,7,28,,126請問28和126中(zhong)間那個數(shu)是(shi)什么?為什么?
第一題(ti)的答案應該是4^3-1=63
規(gui)律是(shi)n^3-1(當n為偶數0,2,4)
n^3+1(當(dang)n為奇數1,3,5)
答案:63
2.用兩個(ge)棧實現一個(ge)隊(dui)列的功能?要求給出算(suan)法(fa)和思路!
設2個棧為A,B, 一(yi)開始(shi)均為空(kong).
入隊:
將新元素push入棧A;
出隊:
(1)判斷棧B是(shi)否為空;
(2)如果不為(wei)空(kong),則將棧(zhan)(zhan)A中所有元素依次pop出并push到(dao)棧(zhan)(zhan)B;
(3)將棧B的棧頂(ding)元素(su)pop出(chu);
這樣(yang)實現的(de)(de)隊(dui)列入隊(dui)和出隊(dui)的(de)(de)平攤復雜度都還(huan)是O(1), 比上(shang)面的(de)(de)幾種方法要(yao)好。3.在(zai)c語言庫(ku)函(han)數中將(jiang)一(yi)個(ge)字(zi)符轉(zhuan)換成整型(xing)的(de)(de)函(han)數是atool()嗎,這個(ge)函(han)數的(de)(de)原(yuan)型(xing)是什(shen)么(me)?
函數名: atol
功 能(neng): 把字(zi)符串轉換成長整型數
用 法(fa): long atol(const char *nptr);
程序例:
#i nclude
#i nclude
int main(void)
{
long l;
char *str = "98765432";
l = atol(lstr);
printf("string = %s integer = %ld\n", str, l);
return(0);
}
2.對于一個頻繁(fan)使用的短小(xiao)函數(shu),在(zai)C語言中應(ying)用什么實(shi)現,在(zai)C++中應(ying)用什么實(shi)現?
c用宏定義,c++用inline
3.直接(jie)鏈(lian)接(jie)兩個信(xin)令點的一組(zu)鏈(lian)路稱作(zuo)什么?
PPP點到點連接
4.接(jie)入網用的(de)是什么接(jie)口?
5.voip都用了那些協議?
6.軟件測試都有那些種類?
黑盒:針(zhen)對系統功能的(de)測(ce)試(shi)(shi) 白合(he):測(ce)試(shi)(shi)函數(shu)功能,各函數(shu)接口
7.確定模塊(kuai)的(de)(de)功(gong)能和模塊(kuai)的(de)(de)接(jie)口是在(zai)軟件設(she)計的(de)(de)那個隊段完(wan)成的(de)(de)?
概要設計階段
8.enum string
{
x1,
x2,
x3=10,
x4,
x5,
}x;
問x= 0x801005,0x8010f4 ;
9.unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
請問p1+5= ;
p2+5= ;
三.選擇題:
1.Ethternet鏈接到(dao)Internet用到(dao)以下那個協(xie)議?
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
2.屬于網(wang)絡(luo)層協議的是:
A.TCP;B.IP;C.ICMP;D.X.25
3.Windows消息調度機制是:
A.指令(ling)隊(dui)列;B.指令(ling)堆(dui)棧;C.消息隊(dui)列;D.消息堆(dui)棧;
4.unsigned short hash(unsigned short key)
{
return (key>>)%256
}
請問hash(16),hash(256)的(de)值分別是:
A.1.16;B.8.32;C.4.16;D.1.32
四.找(zhao)錯題:
1.請問(wen)下面程序有什么(me)錯誤?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
把循環語句(ju)內外(wai)換一下
2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum
{
......;
}
死循環
3.以下是求一個數的平方的程序,請(qing)找出(chu)錯誤:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
4.typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
五.問答(da)題:
1.IP Phone的原理是什么?
IPV6
2.TCP/IP通信建立的(de)過程(cheng)怎樣,端口有什么作用?
三次握手(shou),確定是哪個應用程序使(shi)用該協(xie)議
3.1號(hao)(hao)信(xin)令和7號(hao)(hao)信(xin)令有什么(me)區別,我(wo)國某前廣泛使用的(de)是那一種?
4.列舉5種(zhong)以上的電話新業(ye)務?
高級題
6、已知一個(ge)(ge)單向鏈表的頭,請寫出刪(shan)(shan)除(chu)其某一個(ge)(ge)結(jie)點的算法(fa),要求,先找到此結(jie)點,然后刪(shan)(shan)除(chu)。
slnodetype *Delete(slnodetype *Head,int key){}中(zhong)if(Head->number==key)
{
Head=Pointer->next;
free(Pointer);
break;
}
Back = Pointer;
Pointer=Pointer->next;
if(Pointer->number==key)
{
Back->next=Pointer->next;
free(Pointer);
break;
}
void delete(Node* p)
{
if(Head = Node)
while(p)
}
有一個16位(wei)的整數,每4位(wei)為一個數,寫函數求他(ta)們(men)的和。
解釋:
整(zheng)數1101010110110111
和(he) 1101+0101+1011+0111
感覺應該不(bu)難,當時(shi)對題理解(jie)的不(bu)是很清(qing)楚,所(suo)以(yi)寫了一個函數,也(ye)不(bu)知道對不(bu)對。
疑問:
既然是(shi)16位的(de)整數(shu),1101010110110111是(shi)2進制的(de),那么函數(shu)參數(shu)怎(zen)么定義呢,請大蝦指教。
答(da)案:用十進制做參數(shu),計算時(shi)按二進制考(kao)慮。
/* n就是16位的數,函數返回它的四(si)個部分(fen)之和 */
char SumOfQuaters(unsigned short n)
{
char c = 0;
int i = 4;
do
{
c += n & 15;
n = n >> 4;
} while (--i);
return c;
}
有1,2,....一直到n的無(wu)序(xu)(xu)數組,求排序(xu)(xu)算(suan)法,并且(qie)要求時(shi)間復(fu)雜(za)(za)度為(wei)O(n),空間復(fu)雜(za)(za)度O(1),使用交(jiao)換,而且(qie)一次只能交(jiao)換兩個數.(華為(wei))
#i nclude
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<
return 0;
}
華為面試(shi)題:怎么判斷鏈表中是否有環?
bool CircleInList(Link* pHead)
{
if(pHead = = NULL || pHead->next = = NULL)//無節點或(huo)只(zhi)有一個節點并(bing)且無自環(huan)
return (false);
if(pHead->next = = pHead)//自環
return (true);
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead->next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if(pTemp = = pTemp1)
return (true);
return (false);
}
兩個(ge)字符(fu)(fu)串(chuan),s,t;把t字符(fu)(fu)串(chuan)插入到s字符(fu)(fu)串(chuan)中,s字符(fu)(fu)串(chuan)有足夠的(de)空(kong)間存(cun)放t字符(fu)(fu)串(chuan)
void insert(char *s, char *t, int i)
{
memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);
memcpy(&s[i],t,strlen(t));
s[strlen(s)+strlen(t)]='\0';
}
1。編(bian)寫一個 C 函(han)數(shu),該(gai)函(han)數(shu)在一個字(zi)(zi)符(fu)(fu)串中(zhong)找(zhao)到可能的(de)最(zui)長的(de)子(zi)字(zi)(zi)符(fu)(fu)串,且該(gai)字(zi)(zi)符(fu)(fu)串是由同一字(zi)(zi)符(fu)(fu)組成(cheng)的(de)。
char * search(char *cpSource, char ch)
{
char *cpTemp=NULL, *cpDest=NULL;
int iTemp, iCount=0;
while(*cpSource)
{
if(*cpSource == ch)
{
iTemp = 0;
cpTemp = cpSource;
while(*cpSource == ch)
++iTemp, ++cpSource;
if(iTemp > iCount)
iCount = iTemp, cpDest = cpTemp;
if(!*cpSource)
break;
}
++cpSource;
}
return cpDest;
}
2。請編寫一個 C 函(han)數(shu),該(gai)函(han)數(shu)在給定的內存(cun)區域搜(sou)索給定的字符,并返回(hui)該(gai)字符所在位置索引值。
int search(char *cpSource, int n, char ch)
{
int i;
for(i=0; i
return i;
}
一個(ge)單向鏈表(biao),不(bu)知道頭節點(dian),一個(ge)指(zhi)針指(zhi)向其中的一個(ge)節點(dian),問(wen)如(ru)何刪除(chu)這個(ge)指(zhi)針指(zhi)向的節點(dian)?
將這個指(zhi)針指(zhi)向(xiang)的(de)(de)next節(jie)(jie)點(dian)值copy到(dao)本節(jie)(jie)點(dian),將next指(zhi)向(xiang)next->next,并(bing)隨后(hou)刪(shan)除原next指(zhi)向(xiang)的(de)(de)節(jie)(jie)點(dian)。
#i nclude
void foo(int m, int n)
{
printf("m=%d, n=%d\n", m, n);
}
int main()
{
int b = 3;
foo(b+=3, ++b);
printf("b=%d\n", b);
return 0;
}
輸出:m=7,n=4,b=7(VC6.0)
這(zhe)種方(fang)式(shi)和編(bian)譯(yi)器中得函數調(diao)用關(guan)(guan)系相關(guan)(guan)即先后入棧順序。不過(guo)不同
編譯器(qi)得處理不(bu)同。也是因(yin)為(wei)C標(biao)準中對(dui)這種方式說(shuo)明為(wei)未定義,所以
各(ge)個(ge)編譯器廠(chang)商都有自己(ji)得(de)理解,所以最后(hou)產生得(de)結果完全(quan)不同。
因為這樣,所以遇見這種函(han)數,我們(men)首(shou)先(xian)要考慮我們(men)得(de)編(bian)譯器會如何處(chu)理(li)
這樣得(de)函(han)數(shu),其次看函(han)數(shu)得(de)調(diao)用(yong)方(fang)式(shi),不同得(de)調(diao)用(yong)方(fang)式(shi),可能產(chan)生不同得(de)
結果(guo)。最后是看編譯器優化。
2.寫(xie)一(yi)函數,實現刪除字符串str1中含(han)有的(de)字符串str2.
第二個(ge)就是利(li)用(yong)(yong)一(yi)個(ge)KMP匹配算法找到str2然后刪除(chu)(用(yong)(yong)鏈表實現的話,便捷于數組)
==============================================================================
微軟亞洲技術中心(xin)的面試題(ti)!!!
1.進程和線程的差別。
線程(cheng)是指進程(cheng)內的一個執行單元,也是進程(cheng)內的可(ke)調度實(shi)體.
與進程(cheng)的區別:
(1)調(diao)度:線程作(zuo)為(wei)(wei)調(diao)度和分配的基本單(dan)位,進程作(zuo)為(wei)(wei)擁有資源(yuan)的基本單(dan)位
(2)并(bing)發性:不僅進(jin)程(cheng)(cheng)之間可以并(bing)發執(zhi)行(xing),同一個進(jin)程(cheng)(cheng)的(de)多個線(xian)程(cheng)(cheng)之間也可并(bing)發執(zhi)行(xing)
(3)擁(yong)有(you)(you)資(zi)源(yuan):進程是擁(yong)有(you)(you)資(zi)源(yuan)的(de)一(yi)個(ge)獨立單位(wei),線程不擁(yong)有(you)(you)系統資(zi)源(yuan),但可以訪問隸屬于進程的(de)資(zi)源(yuan).
(4)系統開(kai)銷:在創建(jian)或撤消進程時,由于(yu)系統都要為之分配和回(hui)收資源,導致系統的開(kai)銷明顯大(da)于(yu)創建(jian)或撤消線程時的開(kai)銷。
2.測(ce)試方法
人工測試:個人復查、抽查和會審
機器測試(shi):黑(hei)盒測試(shi)和白盒測試(shi)
2.Heap與stack的(de)差別。
Heap是(shi)堆,stack是(shi)棧。
Stack的空間由操作(zuo)系統自(zi)動分配/釋放,Heap上的空間手(shou)動分配/釋放。
Stack空間有限,Heap是很大的自由(you)存(cun)儲區
C中的malloc函數分配(pei)的內存空間即在堆上,C++中對應(ying)的是new操作(zuo)符。
程(cheng)序在(zai)編譯期對變量(liang)和函數(shu)分配內存都在(zai)棧上進(jin)(jin)行,且程(cheng)序運(yun)行過程(cheng)中函數(shu)調用時參數(shu)的(de)傳遞也在(zai)棧上進(jin)(jin)行
3.Windows下的內存是如何管理的?
4.介(jie)紹.Net和.Net的安全性。
5.客戶端如何訪(fang)問.Net組件(jian)實現Web Service?
6.C/C++編譯(yi)器中虛表是(shi)如(ru)何(he)完成(cheng)的?
7.談談COM的線程模型。然后討論(lun)進(jin)程內/外(wai)組件的差(cha)別。
8.談談IA32下的分頁機制
小頁(ye)(4K)兩級(ji)分頁(ye)模式,大頁(ye)(4M)一(yi)級(ji)
9.給兩(liang)個(ge)變量,如何找出(chu)一個(ge)帶環單鏈表中是什么(me)地方出(chu)現環的?
一個(ge)遞(di)(di)增(zeng)一,一個(ge)遞(di)(di)增(zeng)二,他們指向同一個(ge)接點(dian)時就是環出現(xian)的地方
10.在IA32中一(yi)共有多(duo)少種辦法從(cong)用戶(hu)態跳到內(nei)核態?
通過調用門,從ring3到ring0,中斷從ring3到ring0,進入vm86等等
11.如果只想讓程序(xu)有一(yi)個實(shi)例運行,不能運行兩(liang)個。像(xiang)winamp一(yi)樣,只能開一(yi)個窗口,怎樣實(shi)現?
用(yong)內存映射或全局(ju)原子(互(hu)斥(chi)變量)、查找窗口(kou)句(ju)柄..
FindWindow,互斥,寫標志到文(wen)件或(huo)注冊表,共享(xiang)內存。.
12.如何截取(qu)鍵(jian)盤(pan)的(de)響應(ying),讓所有(you)的(de)‘a’變成‘b’?
鍵盤(pan)鉤(gou)子SetWindowsHookEx
13.Apartment在COM中有什么用?為什么要引入?
14.存儲過(guo)程是什么?有什么用(yong)?有什么優點?
我的理(li)解就(jiu)是一堆sql的集(ji)合,可以建立(li)非常復雜的查(cha)詢,編譯運行,所以運行一次后,以后再運行速(su)度比單(dan)獨執(zhi)行SQL快很多
15.Template有什(shen)么特點?什(shen)么時候用?
16.談談Windows DNA結構的特點(dian)和(he)優點(dian)。
網絡編程(cheng)中設計并發服(fu)務器,使用多進程(cheng) 與 多線程(cheng) ,請問有什(shen)么區別(bie)?
1,進(jin)程(cheng):子(zi)進(jin)程(cheng)是父進(jin)程(cheng)的(de)復制品(pin)。子(zi)進(jin)程(cheng)獲得父進(jin)程(cheng)數(shu)據空間、堆(dui)和棧的(de)復制品(pin)。
2,線程(cheng)(cheng):相對與(yu)(yu)進(jin)程(cheng)(cheng)而言,線程(cheng)(cheng)是一個更加(jia)接近(jin)與(yu)(yu)執(zhi)行體的(de)概(gai)念,它(ta)可以與(yu)(yu)同進(jin)程(cheng)(cheng)的(de)其他線程(cheng)(cheng)共享數據,但擁有自己的(de)棧空間,擁有獨立的(de)執(zhi)行序列。
兩者都可以提高程序的并發度,提高程序運行效(xiao)率和響應時間。
線程(cheng)(cheng)和進(jin)(jin)程(cheng)(cheng)在(zai)(zai)使用上各有優缺點:線程(cheng)(cheng)執行開銷(xiao)小,但不利于(yu)資源管(guan)理和保(bao)護;而(er)進(jin)(jin)程(cheng)(cheng)正相反。同時,線程(cheng)(cheng)適(shi)合于(yu)在(zai)(zai)SMP機(ji)器上運行,而(er)進(jin)(jin)程(cheng)(cheng)則可以跨機(ji)器遷移。
===============================================================================
思科
1. 用宏定義寫出swap(x,y)
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
2.數(shu)(shu)組a[N],存放了1至N-1個(ge)數(shu)(shu),其中某個(ge)數(shu)(shu)重復(fu)一(yi)次。寫(xie)一(yi)個(ge)函(han)(han)數(shu)(shu),找出(chu)被(bei)重復(fu)的數(shu)(shu)字.時間復(fu)雜度(du)必須為(wei)o(N)函(han)(han)數(shu)(shu)原型:
int do_dup(int a[],int N)
3 一語句實現x是否為2的(de)若干次冪的(de)判斷
int i = 512;
cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;
4.unsigned int intvert(unsigned int x,int p,int n)實現對x的進(jin)行(xing)轉換(huan),p為起(qi)始轉化(hua)位,n為需要(yao)轉換(huan)的長(chang)度,假設起(qi)始點在右邊.如x=0b0001 0001,p=4,n=3轉換(huan)后(hou)x=0b0110 0001
unsigned int intvert(unsigned int x,int p,int n){
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i){
_t |= _a;
_a = _a << 1;
}
_t = _t << p;
x ^= _t;
return x;
}