C,C++面試指南筆記_第1頁
C,C++面試指南筆記_第2頁
C,C++面試指南筆記_第3頁
C,C++面試指南筆記_第4頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言語句是指以分號作為結(jié)束符,編譯后產(chǎn)生機(jī)器指令的代碼。預(yù)處理指令不是C語句。2、變量的聲明和定義有什么區(qū)別?定義:為變量分配地址和存儲空間。聲明:不分配地址。ー個變量可以在多個地方聲明,只能在ー個地方定義。加入extern修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。說明:很多時候ー個變量,只是聲明,不分配內(nèi)存空間,直到個體使用時オ初始化分配內(nèi)存空間,如外部變量。3、以最簡單的方式使電腦發(fā)出蜂鳴聲音?使電腦發(fā)出蜂鳴有很多方法:可以調(diào)用beep:可以用匯編直接操作蜂鳴器對應(yīng)的管腳。最簡單的方式:#include"stdio.h''intmain(intargc,char*argv[])(printf(”\7");//常用字符的ASCI!值return0;}4、編程規(guī)范包括程序的可行性,可讀性,可移植性及可測試性。可行性:是目的,也是規(guī)范的靈魂。通常要注意:預(yù)處理命令的使用;運算符優(yōu)先級的區(qū)別;指針的使用等。可讀性:變量和函數(shù)名的命名做到見名知義;適當(dāng)加注釋(寫在代碼的上方或右方);無參數(shù)函數(shù)時最好加void等。可移植性:使用標(biāo)準(zhǔn)庫函數(shù),并且把它們和ANSI/ISOC標(biāo)準(zhǔn)中定義的頭文件放在ー起使用。等等??蓽y試性:增加打印消息,跟蹤程序流程,這樣可使測試者更加快捷地找到問題所在;嵌套最好不多于五層。等。5、變量與函數(shù)名命名的習(xí)慣滿足命名規(guī)則,不能用關(guān)鍵字。(以下總結(jié)為可讀性)標(biāo)識符最好采用英文單詞或其組合,切忌中英混用且不要過長。Windows系統(tǒng)中標(biāo)識符通常大小寫混排如LittleBoyo指針變量命名基本原則:一重指針為“p”+變量類型前綴+名稱,如float類型指針pfStat.多重指針類似。程序中最好不要出現(xiàn)局部變量與全局變量完全相同的情況。符號常量常用下劃線分隔單詞。全局變量加前綴g_。類的數(shù)據(jù)成員加前綴m_(表示member),避免數(shù)據(jù)成員與成員函數(shù)參數(shù)同名時混。6、寫出bool,int,float.指針變量(用flag表示的)與“零值”比較的if語句。?bool:if(flag) )else

B;)或:if(!flag)else((B;A;}不良習(xí)慣:)If(flag==TRUE);if(flag==FALSE);if(flag==l);if(flag==O)?int:If(O!=flag)或:If(O==flag)((A;B;})ElseElse({B;A;}}不良習(xí)慣:If(flag==FALSE);if(flag).?指針類型:If(NULL==flag)}Else(B;}或:if(NULL!=flag)(B;}Else(A;}不良習(xí)慣:If(p==O);if(p!=O);if(p).?float:constfloatNORM=0.0001;If((flag>=NORM)&&(flag<=NORM))(A;不良習(xí)慣:If(x==O.O);if(x!O.O).應(yīng)當(dāng)特別注意:在int,指針變量和零值比較時,把零值寫在左邊。是因為當(dāng)把”=ゴ寫成“=”時,編譯器可以報錯,否則這種邏輯錯誤不容易被發(fā)現(xiàn)。7、代碼ー、shortsl=l;sl=sl+lL;代碼二、shortsl=l;sl+=lL;以上兩段代碼是否都正確?類型轉(zhuǎn)換關(guān)系:例如:short和int型數(shù)據(jù)相加,則將short轉(zhuǎn)換成int.代碼一中si是short,轉(zhuǎn)換成long與1L相加,得到的是long和,但賦值給short型的si,所以不正確。改為:Shortsl=l;sl=(short)(sl+lL);代碼二中“+=”會進(jìn)行類型轉(zhuǎn)換,所以正確。8、C中任何數(shù)據(jù)在內(nèi)存中都是以二進(jìn)制形式存放的。而數(shù)值是以補(bǔ)碼表示的。字符型數(shù)據(jù)在內(nèi)存中是按其ASCII碼值來存儲的,其ASCII碼值在內(nèi)存中也是以二進(jìn)制形式存儲的。9、什么是左值,什么是右值?左值位于賦值號左邊,右值位于賦值號右邊。常量不可尋址,變量可以,變量有兩個相關(guān)值:地址值和數(shù)據(jù)值。數(shù)據(jù)值:存儲在內(nèi)存中的數(shù)據(jù),也稱為變量的右值。地址值:存儲數(shù)據(jù)值的地址,也稱為變量的左值。左值一般是變量,右值可以是變量,表達(dá)式或常量。即左值可以為右值,右值不可以為左值。10、字符型數(shù)據(jù)無論在!6位機(jī)上還是32位機(jī)上都是占ー個字節(jié),而基本整型在16位機(jī)上占兩個字節(jié),在32位機(jī)上占四個字節(jié)。因此,用si沈of求字節(jié)數(shù)時要注意分情況。11、Sizeof與strlen的區(qū)別?sizeof是ー個操作符,而strlen是庫函數(shù)。?Sizeof用來返回一個數(shù)據(jù)類型的占的字節(jié)數(shù),參數(shù)可以是數(shù)據(jù)類型也可以是變量且后面的小括號可以不寫。Strlen用來返回一個字符串的長度且只能以へ(T作為結(jié)束符的字符串為參數(shù)。?編譯器在編譯時就計算出sizeof的值,而strlen函數(shù)是在運行時オ計算出來。?數(shù)組做sizeof參數(shù)不退化,做strlen參數(shù)時退化為指針。例如:#include"stdio.h"#include"string.h"voidmain(void)charstr[10]=',abce";intx=strlen(str);inty=sizeof(str);printf("%d,%d\n",x,y);)結(jié)果為:4,1012、〃位域#include"stdio.h"structsi(inti:8;charj:4;inta:4;doubleb;);structs2(inti:8;intj:4;doubleb;inta:4;);structs3(inti;charj;doubleb;inta;);〃怎么區(qū)分是結(jié)構(gòu)體還是位域??voidmain(void)(printf(',sizeof(sl)=%d\n',,sizeof(structsi));printf("sizeof(s2)=%d\n",sizeof(structs2));printf("sizeof(s3)=%d\n",sizeof(structs3));}注:在VC中都是24。怎么回事?書上是:16,24,32說每個數(shù)據(jù)都要對照結(jié)構(gòu)體內(nèi)最大數(shù)據(jù)字節(jié)數(shù)的最小公倍數(shù)補(bǔ)齊。位域:是把ー個字節(jié)中的位按照實際的需求分成不同的區(qū)域,表明每個區(qū)域位數(shù),區(qū)域的域名,并允許程序按照域名進(jìn)行操作。如此就可以把不同的對象用一個字節(jié)來表示。能節(jié)省空間。即成員均按二進(jìn)制位分配。位域定義格式:struct位域的結(jié)構(gòu)名{位域列表};位域列表表示形式:類型說明符位域名:位域的長度如上sl,s2,s3o幾點說明:ー個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所??臻g不夠存放另ー個位域時,應(yīng)從下ー單元起存放該位域。也可以有意使某位域從下ー單元開始。如:Structwy(Unsigneda:6;Unsigned:〇;//空域Unsignedb:4;//從下ー單元開始存放Unsignedc:4;);在這個位域定義中,a占第一個字節(jié)的6位,后2位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。由于位域不能跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是不能超過8位二進(jìn)制位。位域可以無位域名,這時它只用來填充或調(diào)整位置。無名的位域是不能使用的。例如:structkyInta:l;Int:2;〃這兩位不能使用Intb:3;Intc:2;);13、C和C++中的static有什么區(qū)別?C中:static用來修飾變量或函數(shù),主要用來說明這個變量或函數(shù)只能在本文件代碼塊中訪問,且static修飾的變量存放在段存儲區(qū)。主要有以下用途:定義局部靜態(tài)變量存儲在靜態(tài)存儲區(qū),在程序運行期間不會釋放,只在聲明時初始化ー次,若沒有初始化,自動賦值為〇或空字符。具有局部變量的’’記憶性”及生存周期“全局性"特點。''記憶性”是指在兩次函數(shù)調(diào)用時,第二次調(diào)用開始時,變量能夠保持上一次調(diào)用結(jié)束時的值。''全局性”可改善函數(shù)返回指針的問題,局部變量的問題在于當(dāng)函數(shù)退出時其生存期結(jié)束。而利用static修飾的局部變量卻可以延長其生存期。限定訪問區(qū)域被static修飾的變量及函數(shù)只能被同一文件內(nèi)的代碼段訪問。C++中,除上述兩種還有:定義靜態(tài)成員變量和靜態(tài)成員函數(shù)。靜態(tài)成員變量或靜態(tài)成員函數(shù)表示其不屬于任何ー個類實例,是類的所有類實例所其有的。實現(xiàn)在多對象實例間進(jìn)行通信,傳遞信息。如:#include',iostream.h"#incJude,,string.h,'classA(public:staticinta;staticintgeta();intb;intgetb(););intA::a=100;intA::geta()(returna;}intA::getb()returnb;voidmain(void)Am,n;m.b=90;cout?m.geta()?endl;cout?m.getb()?endl;cout?m.a?endl;n.a=33;n.b=44;cout<<m.geta()<<endl;〃體現(xiàn)共用cout?m.getb()?endl;cout?m.a?endl;//體現(xiàn)共用}14、C,C++的結(jié)構(gòu)體有什么區(qū)別?C的結(jié)構(gòu)體是不能有函數(shù)成員的,只是ー些已有數(shù)據(jù)結(jié)構(gòu)組合而成,而C+俵可以。C結(jié)構(gòu)體數(shù)據(jù)成員沒有public,private,protected之分,C++有。C的結(jié)構(gòu)體沒有繼承關(guān)系,C++有。注:結(jié)構(gòu)體可簡單理解為類的前身。15、C中的malloc和C++中的new有什么區(qū)別?malloc,free,new,delete都是用來動態(tài)申請內(nèi)存和釋放內(nèi)存的。malloc,free是標(biāo)準(zhǔn)函數(shù),而new,delete是運算符。前兩個在C,C++中都可使用,要包含相應(yīng)的頭文件,可以覆蓋;而后兩個只屬于C++,不需要頭文件的支持,可以重載。Malloc要指定申請內(nèi)存的大小,其申請的只是一段內(nèi)存空間。New不必指定申請內(nèi)存的大小,只是建立一個對象。New和delete調(diào)用對應(yīng)的構(gòu)造函數(shù)和析構(gòu)函數(shù)。而malloc,free只是分配內(nèi)存和回收內(nèi)存。malloc,free返回的是void類型指針,new,delete返回的是某種數(shù)據(jù)類型指針。16、C中指針和C++引用有什么區(qū)別?引用是變量或?qū)ο蟮膭e名,不是值,不占據(jù)存儲空間,只有聲明沒有定義。在C++中可用于:?函數(shù)參數(shù)當(dāng)函數(shù)的返回值多于ー個時,可用指針實現(xiàn)。如:#include',iostream.h"voidswap(int*a,int*b)(inttemp;temp=*a;*b=temp;}voidmain(void)(inta=10,b=20;cout?"beforechange:,,?a?""?b?endl;swap(&a,&b);cout?"afterchange:^'?'^*'?b?endl;}結(jié)果是:beforechange:10,20afterchange:20,10也可以用引用實現(xiàn),如:#include"iostream.h"voidswap(int&a,int&b)(inttemp;temp=a;a=b;b=temp;voidmain(void)inta=10,b=20;cout?"beforechange:,,?a?""?b?endl;swap(a,b);cout?"afterchange:^'?'^*'?b?endl;)結(jié)果是:beforechange:10,20afterchange:20,10引用更加簡便和易理解。?指針可不初始化且初始化時,可以指向ー個地址,也可以為空。引用必須初始化且只能初始化一次。?引用之間賦值和指針之間賦值不同。指針賦值如下:intvl=7,v2=9;int*pl=&vl,*p2=&v2;pl=p2;/*p!指向變了?/引用賦值如下:intvl=7,v2=9;int&rl=vl,&r2=v2;rl=r2;/?改變的是vl的值,將r2指向的對象v2的值賦值給VI。而rl,r2仍指向原來的變量。*/?由上述例子可知,指針可以改變指向,而引用總是指向初始化時的對象。17、預(yù)處理在C/C++中預(yù)處理如宏定義、文件包含、條件編譯等。簡述#ifdef,#else,#endif,#ifndef的作用軟件程序的升級是在已成型軟件的基礎(chǔ)上進(jìn)行修改和擴(kuò)充。升級工作非常復(fù)雜和煩瑣,因為軟件不斷地升級,程序體積在不斷擴(kuò)大,但是老用戶卻不能受到影響。條件編譯指令便是解決這ー問題的最佳選擇。條件編譯指令#ifdef,#else,#endif,#ifndef作用有:(1)利用#ifdef和#endif將某程序功能模塊包括進(jìn)去,以向特定用戶提供該功能,在不需要時用戶可輕易屏蔽。如:#ifdefMATH#include"math.c"#endif注:如果不許向別的用戶提供該功能,則在編譯之前將首行的MATH加一個下劃線即可。(2)在子程序前加上標(biāo)記,以便于追蹤和調(diào)試。#ifdefDEBUGprintf(*'indebugging ");#endif(3)應(yīng)對硬件的限制。由于ー些具體應(yīng)用環(huán)境的硬件不一樣,限于條件,本地缺乏這種設(shè)備,只能繞過硬件,直接寫出預(yù)期結(jié)果。#ifdefYAN2410i=getBordNum();〃當(dāng)沒有YAN2410硬件時,程序調(diào)試運行時繞過此語句#elsei=0;#endif18、typedef和define有什么區(qū)別?(1)用法不同typedef是用來說明一個數(shù)據(jù)類型的別名,以增強(qiáng)程序的可讀性。define是用來定義符號常量和帶參數(shù)宏。(2)執(zhí)行時間不同typedef定義是定義語句,占用運行時間。且有類型檢査功能。define是預(yù)處理,只占編譯時間。只是簡單進(jìn)行字符串的替換,不進(jìn)行類型檢査。(3)typedef有作用域限制,define沒有,只要在聲明后引用均可。#include<stdio.h>voidfl(void)(TypedefintINT;INTA=3;Printf("A:%d",A);}?編譯不會通過,typedef定義的INT只限制在f1函數(shù)里。?上述例子不是很恰當(dāng),typedef一般不放在函數(shù)里,在此只是為了說明問題#include<stdio.h>voidfl(void)(#defineMAX100;}Voidmain(void)(Printf("MAX:%d",MAX);}?編譯運行正確。(4)對指針的操作不同?#include<stdio.h>#definepCHARchar*typedefchar*pchar;pCHARa,b;pcharx,y;printf("sizeof(a):%d\nsizeof(b):%d\n",sizeof(a),sizeof(b));printf(Hsizeof(x):%d\nsizeof(y):%d\n",sizeof(x),sizeof(y));}結(jié)果為:Sizeof(a):4Sizeof(b):lSizeof(x):4Sizeof(y):4注意:用define定義的char?只是簡單替換19、#defineCHARchar?和typedefchar*CHAR有什么區(qū)別?由define定義的類型別名可以被其他修飾符擴(kuò)展如unsigned,而typedef不可。define定義的類型別名代表指針時,其連續(xù)聲明的變量中只有第一個是指針,其他的均為非指針的普通變量,而typedef能夠保證連續(xù)聲明的所有變量都為同一類型的指針。如18.20、const(l)const用來定義ー個常量:定義時初始化,之后不能被更新。如:constdoublePI=3.14;⑵便于類型檢査:用const方法可以使編譯器對處理內(nèi)容有更多的了解。如:voidfl(constinta)(}編譯器就可以知道a在該函數(shù)中不能改變,若改變就會報錯。⑶同宏定義ー樣方便進(jìn)行參數(shù)的修改和調(diào)整:如果想改變某個值,只需改變定義處。(4)節(jié)省空間:避免不必要的內(nèi)存分配。如:#defineMAX100constintmax=100;〃不分配空間inta=max;〃為max分配空間,以后不再分配Intb=MAX;//編譯時進(jìn)行宏替換,為b分配空間?Intc=max;〃分配空間Intd=MAX;〃編譯時進(jìn)行宏替換,為d分配空間?比宏定義節(jié)省空間????????⑸為函數(shù)重載提供參考,如下:classA(voidfl(void);voidfl(void)const;〃聲明為上一個函數(shù)的重載21、說明下面a的各種聲明含義。Constinta;//a只讀Intconsta;//a只讀Constint*a;/?定義了一個指針a,這個指針指向常整形數(shù)據(jù)。即指針是普通指針,可以改變其值,但是其指向的常整形數(shù)據(jù)是不能通過指針改變的。*/Int*consta;/?定義了一個常指針a,這個指針指向整型數(shù)。即指針的值不能改變,但是指向的整型變量的值是可以改變的。*/Intconst*aconst;/?定義了一個常指針a,這個指針指向一個常整型數(shù)。即指針的值不能改變,其指向的整型數(shù)據(jù)的值也不能改變。*/22、const,define定義常量的區(qū)別常量的引入可以增強(qiáng)程序的可讀性,可以使程序的維護(hù)和調(diào)試更加方便,使書寫簡便。區(qū)別:(l)const定義常量有數(shù)據(jù)類型,而define沒有。⑵很多集成開發(fā)環(huán)境只支持對const定義的常量的調(diào)試,不支define定義的常量。(3)Const定義的常量是要分配內(nèi)存空間的,而define定義的常量卻不分配空間。23、static在C中主要用于定義全局靜態(tài)變量,局部靜態(tài)變量,靜態(tài)函數(shù)。C++中新增了:定義靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員。24>volatile表示動態(tài)的,易變的。在嵌入式編程中狀態(tài)寄存器變量會隨時被外界條件改變,屬于這種類型的變量。在多線程編程中臨界變量被幾個線程共享,也是易變的。25、ー個參數(shù)可以既是const又是volatile嗎??Volatile修飾的變量的值是程序不可控的,可以任何不被程序明確指明的方式改變,例如:外部端口。它的變化不用程序內(nèi)部的賦值語句就可實現(xiàn)。編譯器不會優(yōu)化這種由volatile修飾的變量。Const修飾的變量在程序中是只讀的,不能被改變的。但這僅限于程序內(nèi)部,它可以被程序外的東西改變。例如用const修飾外部端口,程序內(nèi)部不能修改它的值,但是外部卻可以。但是編譯器會優(yōu)化掉const修飾的變量。?現(xiàn)在用volatile和const來同時修飾ー個變量,比如外部端口。這個變量在程序內(nèi)部不能夠改變,并且編譯器不會對其優(yōu)化,但是外部條件卻可以改變。另外一種常見的情況是只讀的狀態(tài)寄存器。它受volatile修飾,但它卻可能被意想不到地改變??梢?用const和volatile同時修飾變量,表示這人變量在程序內(nèi)部是只讀的,不能改變的,只在程序外部條件下改變,并且編譯器不會優(yōu)化這個變量。每次使用這個變量時,都要小心地去內(nèi)存讀取這個變量的值,而不是去寄存器讀取它的備份。Volatile可用來修飾指針。常見例:子中斷服務(wù)子程序修改ー個指向ー個buffer的指針時,必須用volatile來修飾這個指針。26、引用引用是指某一目標(biāo)變量的別名。對引用的操作和對變量的直接操作一樣。定義:數(shù)據(jù)類型&引用名=目標(biāo)變量名;引用可用作:(1)函數(shù)參數(shù)在C++中大多時候引用可代替指針實現(xiàn)址傳遞。如:#include<iostream.h>voidswap(char&x,char&y)〃引用作參數(shù)(inttemp=0;temp=x;x=y;y=temp;}voidmain(void)(chara=0,b=0;cin?a?b,cout?,,beforeswap,,?endl;cout<<“a:“<<“b:“<<endl;swap(a,b);cout?nafterswap,,?endl;return;}結(jié)果:abbeforeswapa:ab:bafterswapa:bb:a注意:?引用作函數(shù)參數(shù)時,在內(nèi)存中沒有產(chǎn)生參數(shù)的副本即不分配內(nèi)存空間,只是目標(biāo)變量的別名。而一般變量作參數(shù)時,要給形參分配內(nèi)存空間。?沒有數(shù)組的引用。因為沒法給若干個元素定義ー個別名。?引用的聲明一定要初始化。數(shù)據(jù)類型是指目標(biāo)變量的數(shù)據(jù)類型。(2)常引用定義:const數(shù)據(jù)類型&引用名=目標(biāo)變量名;如:charx=l;constchar&rx=x;rx=2;〃錯誤,rx是只讀的x=2;〃正確注意:不能通過目標(biāo)變量的常引用來改變目標(biāo)變量的值。(3)作函數(shù)返回值定義格式:數(shù)據(jù)類型&函數(shù)名(形參列表){函數(shù)體}例1:#include<stdio.h>inttemp;intfl(intx)(temp=(int)(x*x*3);returntemp;}int&f2(intx)(temp=(int)(x*x*3);returntemp;voidmain(void)inta=fl(5);〃系統(tǒng)生成要返回值的副本即臨時變量int&b=fl(100);〃有時會出錯。不能從被調(diào)函數(shù)中返回一個臨時變量或局部變量的引用intc=f2⑸;//系統(tǒng)不生成返回值的副本,可以從被調(diào)函數(shù)中返回一個全局變量的引用int&d=f2(5);〃系統(tǒng)不生成返回值的副本,可以從被調(diào)函數(shù)中返回ー個全局變量的引用cout?a?endl;cout?c?endl;cout?d?endl;}注意:不能返回局部變量的值。局部變量在被調(diào)用函數(shù)返回后就被銷毀掉,它返回的引用所指向的內(nèi)存已沒有任何意義,運行時會出現(xiàn)不可預(yù)知的錯誤。如:#include<iostream.h>int&fl(intx)(inttemp;temp=x;cout<<”infl:,,?endl;cout?"&tempis:,,?&temp?endl;cout?”tempis:,,?temp?endl;returntemp;voidmain(void)(int&a=fl(5);a=9;cout?,,inmain''?endl;cout?n&ais,,?&a?endl;cout?,,ais:,,?a?endl;}結(jié)果:注意:?不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。?可以返回類成員的引用,但最好是常引用。27、常引用常引用的引入主要是為了避免使用變量的引用時,在不知情的情況下改變變量的值。即在很多時候,只想訪問變量的值,不希望改變變量的值。常引用是唯一的選擇。常引用的作用:(1)用途普通變量的只讀別名,通過這個別名只能獲得這個變量的值,不能通過這個別名改變這個變量的值。#include<iostream.h>voidmain(void)(charx^a';constchar&y=x;cout?,,x:,,?x?,,y:,,?y?endl;x=,b,;cout?,,x:,,<<x?,,y:,,?y?endl;y=,a,;cout?,,x:,,?x?,,y:,,?y?endl;}在VC6.0中會出現(xiàn)編譯錯誤:errorc2166:Lvaluespecifiesconstobject即左值是個只讀對象。(2)用于函數(shù)的形參。常引用作形參,可確保在函數(shù)內(nèi)不會意外改變實參的值。28、指針說明以下聲明的含義:int*p[10];定義了一個指針數(shù)組P,10個元素都是整型指針。int(*p)[10];定義了一個指向具有!0個整型元素數(shù)組的數(shù)組指針Point*p(int);定義了一個函數(shù)P,該函數(shù)有一個整型參數(shù),返回值為整型指針。int(*p)(int);定義了一個指向函數(shù)指針P,指向的函數(shù)有一個整型參數(shù),返回值為整型數(shù)據(jù)。int(**p)[10];等價于int(*(*p))[10].*p是數(shù)組指針,定義了一個指向含有10個整型元素數(shù)組的二級數(shù)組指針。char*(*p)[10];等價于(char*)(*p)[10]o*p是數(shù)組指針,指向含有10個元素的數(shù)組,數(shù)組元素的類型是char?〇float(*p[10])();定義了一個含有10個元素的數(shù)組p,數(shù)組的元素是函數(shù)指針,這個函數(shù)沒有參數(shù),返回類型是float型的。double*((*p)[10]);P為數(shù)組的指針,數(shù)組有10個元素,元素為double?型。short(*p)(char);P為函數(shù)指針,它指向的函數(shù)有一個char型的參數(shù),返回值為short型數(shù)據(jù)。long(*(*p)(int,int))(int);假設(shè)pF=(*p)(int,inり,pF是個函數(shù)指針,原式變?yōu)?long(*pF)(int)。pF指向的函數(shù)有一個int型的參數(shù),返回值為long型數(shù)據(jù)。P為函數(shù)指針,它指向的函數(shù)有兩個int型參數(shù),返回值為函數(shù)指針型數(shù)據(jù),這個返回的函數(shù)指針指向的函數(shù)有一個int型的參數(shù),返回值為long型數(shù)據(jù)。29、指針常量和常量指針的區(qū)別指針常量是指定義的指針只能在定義的時候初始化,之后不能改變其值。定義格式如下:數(shù)據(jù)類型?const指針變量名;const位于?右側(cè),說明聲明的對象是ー個常量,而對象的數(shù)據(jù)類型是指針。如:chara[5]=^^abcd^^;char*constcp=a;指針常量的指向不能變,即上例中cp只能指向a,初始化指向誰就不能再改變。但其指向的對象的值是可以變的,即上例中數(shù)組a元素的值可以變。常量指針是指向常量的指針。定義格式:數(shù)據(jù)類型const?常量指針名;或:const數(shù)據(jù)類型?常量指針名;const位于指針聲明符?的左側(cè),說明常量指針的值是可以改變的即指向可以變,但是其指向的內(nèi)容是不能用這個指針改變的,可以自己改變。30、(1)#include<iostream.h>voidmain(void)(charsl[]=^^abcd^^;chars2[]=^^abcd^^;constchars3[]="abcd'';constchars4[]="abcd”;constchar*s5="abcd”;constchar*s6="abcd”;char*s7="abcd”;char*s8="abcd”;cout?(sl==s2)?endl;cout?(s3==s4)?endl;cout?(s5==s6)?endl;cout?(s7==s8)?endl;結(jié)果:0011sl,s2,s3,s4,是數(shù)組,有各自的內(nèi)存空間,所以地址不等。s5,s6,s7,s8是指針,指向相同的常量。字符串常量"abed”產(chǎn)生一個臨時指針變量&(“abcd”)。所以地址相等。(2)寫出結(jié)果#include<iostream.h>voidmain(void)(intb=0;inta[5]={0,l,2,3,4);for(inti=0;i<5;)(i=a[i+l];cout?a[i]?endl;}return;}會下標(biāo)越界,但編譯器不會報錯,C/C++不進(jìn)行數(shù)組越界檢查。結(jié)果是:12340123401234 (死循環(huán))(3)程序是否有錯#defineMAX255#include<stdio.h>voidmain(void)unsignedcharstr[MAX],i;for(i=0;i<=MAX;i++)(str[i]=i;printf(4<%d\n”,str[i]);)}可以賦i為255,再加1,看看結(jié)果。該程序會出現(xiàn)下標(biāo)越界及死循環(huán)。同上。在0?255之間循環(huán)。31、a為數(shù)組名,a和&a有什么區(qū)別?寫出結(jié)果:#include<stdio.h>voidmain(void)(inta[5]={l,23,4,5);int*ptr=(int*)(&a+l);printf(u%d,%d\n,,,*(a+l),*(ptr-l));return;a與&a是不同的。a+1是數(shù)組的首地址加1,是數(shù)組的第二個元素a[l]的地址。&a+l系統(tǒng)會主為是數(shù)組a的首地址加上ー個數(shù)組a的偏移,即偏移ー個數(shù)組的大小。?數(shù)組名a可以作為數(shù)組的首地址,&a是數(shù)組的指針。結(jié)果為:2,532、解析(*(void(*)())0)();void(*0)():是ー個返回值為void,參數(shù)為空的函數(shù)指針0.(void(*)())0:把〇強(qiáng)制轉(zhuǎn)換成返回值為void,參數(shù)為空的函數(shù)指針。*(void(*)())0:加?表示整個是ー個返回值為void,無參數(shù),且起始地址為0的函數(shù)的名字。(*(void(*)())0)():上述函數(shù)名的調(diào)用。33、野指針是怎么產(chǎn)生的,如何避免?野指針是指指向不可用內(nèi)存的指針。通常對這種指針進(jìn)行操作時,程序會發(fā)生不可預(yù)知的錯誤。在以下三種情況發(fā)生:(1)指針變量聲明時沒有被初始化。任何指針變量剛被創(chuàng)建時都不會自動初始化為NULL指針,它的默認(rèn)值是隨機(jī)的,它會指向ー個隨機(jī)地址。通常在定義指針時要求賦值為NULLo#include<iostream.h>typedefint*pint;voidswap(int*pl,int*p2)int*p;〃沒有初始化,成為野指針。改為intp;后面一起改*p=*pl;*pl=*p2;*p2=*p;}voidmain(void)(inta=l,b=3;pintpl=&a,p2=&b;cout?,,a:,,?*pl?,,b:,,?*p2?endl;swap(pl,p2);cout?,,a:,,?*pl?,,b:,,?*p2?endl;return;}(2)指針p被free或delete之后,沒有置為NULL,讓人誤以為p是個合法的指針。為避免這種情況最好在free或delete后賦值為NULL.(3)指針操作超越了變量的作用范圍。如:#include<iostream.h>classApublic:voidfunc(void)(value=3;cout?,,infunofA,,?endl;}public:intvalue;);voidf(A*p){Aa;p=&a;p->func();}voidmain(void){A*P;f(P);p->func();〃出錯return;因為在f中p指向了A的對象a,并調(diào)用了func,輸出infunofA。在f結(jié)束后,a被釋放,p指向了“垃圾”內(nèi)存。但在main中又用p調(diào)用func。由于p指向的內(nèi)存不可用,導(dǎo)致內(nèi)存操作錯誤。解決方法:在變量的作用域結(jié)束前釋放掉變量的地址空間并讓指針指向NULL.數(shù)據(jù)結(jié)構(gòu)常見面試題1、鏈表和數(shù)組的區(qū)別?存儲形式:鏈表可以是ー塊不連續(xù)的動態(tài)空間,長度可變;數(shù)組要求是ー塊連續(xù)空間,聲明時要確定長度。?數(shù)據(jù)訪問:數(shù)組可隨機(jī)訪問,速度快,査找操作直接使用偏移地址;鏈表則要順序檢索,效率低。數(shù)據(jù)插入和刪除:鏈表可快速插入和刪除;數(shù)組則可能要移動大量數(shù)據(jù)。越界問題:鏈表不存在越界問題;而數(shù)組有。?占用空間:存儲相同數(shù)據(jù)時,鏈表要比數(shù)組占用更多空間,因為它除了存數(shù)據(jù)還要存指針。2、快速尋找單鏈表中間結(jié)點。方法:?雙指針同時從頭結(jié)點開始遍歷。?快指針每次移動兩個結(jié)點,慢指針每次移動ー個結(jié)點。?快指針到鏈表尾部時,當(dāng)鏈表長度為奇數(shù)時,慢指針指向的即是鏈表中間指針。當(dāng)鏈表長度為偶數(shù)時,慢指針指向的結(jié)點和慢指針指向結(jié)點的下個結(jié)點都是鏈表的中間結(jié)點。算法設(shè)計:typedefstructNODE(inta;structnode*next;}NODE;NODE*middle(lnode*head){NODE*fast,*slow,*p;if(head==NULL)returnNULL;fast=slow=head;while(!(p=fast?>next)&&!p->next)〃?是II還是&&slow=slow->next;fast=p->next;)returnslow;)3、設(shè)計算法將單鏈表反序過程:把頭結(jié)點(無頭指針)指向空,后面的結(jié)點的next指針指向它前面的ー個元素,最后尾結(jié)點成了頭結(jié)點。算法:(1)循環(huán)算法Listreverse(Listn)(if(!n)returnn;listcur=n->next;listpre=n;listtemp;pre->next=NULL;while(NULL!=cur->next)(temp=cur;temp->next=pre;pre=temp;cur=cur->next;)returntemp;〃返回頭指針)(2)遞歸算法List*reverse(List*oldList,List*newHead=NULL)(List*next=oldList->next;oldList->next=newHead;newHead=oldList;return(next==NULL)?newHead:reverse(t,newHead);)4^單循環(huán)鏈表單循環(huán)鏈表的尾結(jié)點指針指向首結(jié)點,形成一個環(huán),可以從鏈表中的任一結(jié)點出發(fā),訪問鏈表中的所有結(jié)點。帶環(huán)單向鏈表是指環(huán)的起點不是鏈表第一個結(jié)點,即ー個單向鏈表和一個環(huán)形鏈表的結(jié)合體。設(shè)計一個程序,用鍵盤輸入的ー些數(shù)字創(chuàng)建一個單向循環(huán)鏈表,求出鏈表的和度,打印鏈表各個元素。之后可以根據(jù)需求把這個循環(huán)鏈表改裝成單向鏈表或帶環(huán)的單向鏈表?!ńY(jié)點結(jié)構(gòu)typedefstructnode{intdata;structnode*next;}Lnode,*LinkList;〃單向循環(huán)鏈表voidCreatLin

溫馨提示

  • 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

提交評論