版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1.char * const p;char const * pconst char *p上述三個(gè)有什么區(qū)別?char * const p; /常量指針,p的值不可以修改char const * p;/指向常量的指針,指向的常量值不可以改const char *p; /和char const *p-2.char str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;char *str7 = abc;char *str8
2、 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) endl; 打印結(jié)果是什么?解答:結(jié)果是:0 0 1 1str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域-3. 以下代碼中的兩個(gè)sizeof用法有問題嗎?void UpperCase( char str ) / 將 str 中的小寫字母轉(zhuǎn)換成大寫字母 for( size_t i=0; isiz
3、eof(str)/sizeof(str0); +i ) if( a=stri & stri=z ) stri -= (a-A );char str = aBcDe;cout str字符長(zhǎng)度為: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函數(shù)內(nèi)的sizeof有問題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)
4、指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。-4.main()int a5=1,2,3,4,5;int *ptr=(int *)(&a+1);printf(%d,%d,*(a+1),*(ptr-1); 輸出結(jié)果是什么?答案:輸出:2,5*(a+1)就是a1,*(ptr-1)就是a4,執(zhí)行結(jié)果是2,5&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)int *ptr=(int *)(&a+1);則ptr實(shí)際是&(a5),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)5;而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小
5、不同。a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int)所以ptr實(shí)際是a5但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)所以prt-1只會(huì)減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣 a是數(shù)組首地址,也就是a0的地址,&a是對(duì)象(數(shù)組)首地址, a+1是數(shù)組下一元素的地址,即a1,&a+1是下一個(gè)對(duì)象的地址,即a5.-5.請(qǐng)問以下代碼有什么問題:int main()char a;char *str=&a;strcpy(str,hello);printf(str);return 0;答案:沒有為str分配內(nèi)存空間,將會(huì)發(fā)生異常。問題出在將一個(gè)字符串復(fù)制
6、進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。-6. char* s=AAA;printf(%s,s);s0=B;printf(%s,s);有什么錯(cuò)?答案:AAA是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問題。cosnt char* s=AAA;然后又因?yàn)槭浅A浚詫?duì)是s0的賦值操作是不合法的。-7. int (*s10)(int) 表示的是什么?答案:int (*s10)(int) 函數(shù)指針數(shù)組,每個(gè)指針指向一個(gè)int func(int param)的函數(shù)。-8.有以下表達(dá)式:int a=248; b=4;int const
7、c=21;const int *d=&a;int *const e=&b;int const *f const =&a;請(qǐng)問下列表達(dá)式哪些會(huì)被編譯器禁止?為什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;答案: *c 這是個(gè)什么東東,禁止*d 說(shuō)了是const, 禁止e = &a 說(shuō)了是const 禁止const *f const =&a; 禁止-9.#include #include void getmemory(char *p)p=(char *) malloc(100);strcpy(p,hello world);int main( )char *str=N
8、ULL;getmemory(str);printf(%s/n,str);free(str);return 0; 分析一下這段代碼答案:程序崩潰,getmemory中的malloc 不能返回動(dòng)態(tài)內(nèi)存, free()對(duì)str操作很危險(xiǎn)博主:getmemory中p是形參,是一個(gè)指針變量,getmemory(str)調(diào)用后,傳入的是指針變量保存的對(duì)象地址,p=(char *) malloc(100)實(shí)際上是把申請(qǐng)的動(dòng)態(tài)內(nèi)存空間的首地址付給p指向的地址(即str指向的地址null),這個(gè)是錯(cuò)誤的。應(yīng)該修改成指向指針的指針void getmemory(char *p),這樣malloc返回的地址付給*p(
9、即str變量本身)。-10.char szstr10; strcpy(szstr,); 產(chǎn)生什么結(jié)果?為什么?答案:長(zhǎng)度不一樣,會(huì)造成非法的OS-11.要對(duì)絕對(duì)地址0x賦值,我們可以用(unsigned int*)0x = 1234; 那么要是想讓程序跳轉(zhuǎn)到絕對(duì)地址是0x去執(zhí)行,應(yīng)該怎么做?答案:*(void (*)( )0x ) ( );首先要將0x強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:(void (*)()0x然后再調(diào)用它:*(void (*)()0x)();用typedef可以看得更直觀些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x)();-12. 分
10、析下面的程序:void GetMemory(char *p,int num) /p,指向指針的指針,*p,p指向的指針(即str),*p,最終的對(duì)象,str指向的單元*p=(char *)malloc(num); /申請(qǐng)空間首地址付給傳入的被p指向的指針,即str int main() char *str=NULL;GetMemory(&str,100); /傳入指針變量本身的地址strcpy(str,hello);free(str);if(str!=NULL)strcpy(str,world); printf(n str is %s,str); 軟件開發(fā)網(wǎng) getc
11、har(); 問輸出結(jié)果是什么?答案:輸出str is world。free 只是釋放的str指向的內(nèi)存空間,它本身的值還是存在的.所以free之后,有一個(gè)好的習(xí)慣就是將str=NULL.此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語(yǔ)句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,盡管這段程序確實(shí)是存在大大的問題(上面各位已經(jīng)說(shuō)得很清楚了),但是通常會(huì)打印出world來(lái)。這是因?yàn)椋M(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫(kù)函數(shù)自己完成的。 當(dāng)你malloc一塊內(nèi)存的時(shí)候,管理庫(kù)向操作系統(tǒng)申請(qǐng)一塊空間(可能會(huì)比你申請(qǐng)的大一些),然后在這塊空間中記錄一些管理信息(一
12、般是在你申請(qǐng)的內(nèi)存 前面一點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫(kù)通常都不會(huì)將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問這塊地址的。-13.char a10;strlen(a)為什么等于15?#include stdio.h#include string.hvoid main()char aa10;printf(%d,strlen(aa);答案:sizeof()和初不初始化,沒有關(guān)系;strlen()和初始化有關(guān)。-14.char (*str)20;/*str是一個(gè)數(shù)組指針,即指向數(shù)組的指針*/char *str20;/*str是一個(gè)指針數(shù)組,其元素為指針型數(shù)據(jù)*/-15.#inc
13、lude#include #include #include #include #include typedef struct AA int b1:5; int b2:2;AA;void main()AA aa;char cc100;strcpy(cc,abcdefghijklmnopqrstuvwxyz);memcpy(&aa,cc,sizeof(AA);cout aa.b1 endl;cout aa.b2 endl;輸出結(jié)果是多少?答案:-16和 首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.經(jīng)過(guò)strcpy和memcpy后,aa的4個(gè)字節(jié)所存放的值是: 0,1,
14、2,3的ASC碼,即,所以,最后一步:顯示的是這個(gè)字節(jié)的前位,和 之后的位分別為:10000,和01,因?yàn)閕nt是有正負(fù)之分幾道經(jīng)典語(yǔ)言面試題作者:lingfen1552出處:更新時(shí)間: 2007年05月23日一、預(yù)處理器(Preprocessor)1.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)#define SECONDS_PER_YEAR(60* 60* 24* 365)UL考點(diǎn):1).#define語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)2).懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值
15、,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。3).意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出-因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。4).表達(dá)式中用到UL(表示無(wú)符號(hào)長(zhǎng)整型)2.寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。#define MIN(A,B)(A)=(B)?(A):(B)這個(gè)測(cè)試是為下面的目的而設(shè)的:1).標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為了能達(dá)到要求的性能,嵌入代碼經(jīng)常
16、是必須的方法。2).三重條件操作符的知識(shí)。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼,了解這個(gè)用法是很重要的。3).懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái)4).討論下面宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?least= MIN(*p+, b);二、數(shù)據(jù)聲明(Data declarations)用變量a給出下面的定義a)一個(gè)整型數(shù)(An integer)b)一個(gè)指向整型數(shù)的指針(A pointer to an integer)c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(
17、A pointer to a pointer to an integer)d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers)e)一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers)f)一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)g)一 個(gè)指向函數(shù)
18、的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) (A pointer to a function that takes an integer as an argument and returns an integer)h)一 個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù) ( An array of ten pointers to functions that take&nb
19、span integer argument and return an integer)答案是:a) int a;/ An integerb) int*a;/ A pointer to an integerc) int*a;/ A pointer to a pointer to an integerd) int a10;/ An array of 1
20、0 integerse) int*a10;/ An array of 10 pointers to integersf) int(*a)10;/ A pointer to an array of 10 integersg) int(*a)(int);/ A pointer to a function a that takes an integer argum
21、ent and returns an integerh) int(*a10)(int);/ An array of 10 pointers to functions that take an integer argument and return an integer三、Static關(guān)鍵字static的作用是什么?在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用:1).在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值
22、不變。2).在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。3).在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。四、Const關(guān)鍵字const是什么含意?1).合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。2).通過(guò)給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。3).關(guān) 鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲
23、明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其 它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的。)#includeusing namespace std;int main() const char*pa; char const*pb; char ca=a; char cb=b; char* const pc=&ca; const char* const pd
24、=&cb; pa=&ca; pa=&cb; pb=&ca; pb=&cb;*pc=d; printf(ca=%cn, ca); return 0;經(jīng)過(guò)以上測(cè)試const char*pa;char const*pb;上面兩種定義方法一樣都是 pa(pb)指向的變量的值不可改變,及*pa,*pb,而pa,和pb本身是可變的,如:pa=&ca;/okpa=c/errorchar* const pc=&ca;pc本身是不可變的(只能在定義時(shí)初始化),但指向的變量值是可變的,如pc=&ca;/erro
25、r*pc=d;/okconst char* const pd=&cb;pd本身是不可變的,且指向的變量也是不可變的(只能在定義時(shí)初始化)pd=&cb;/error*pd=c;/error通過(guò)以上總結(jié),無(wú)論怎樣定義p都是一指針如果const在*左邊,表示該指針指向的變量是不可變的如果const在*右邊,表示該指針本身是不可變得五、Volatile關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的
26、值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:1).并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2).一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)3).多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會(huì)帶來(lái)災(zāi)難?;卮鹨韵聠栴}:1).一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。2).一個(gè)指針可以是volatile嗎?解釋為什么。3).下面的函數(shù)有什么
27、錯(cuò)誤:int square(volatile int*ptr)return*ptr*ptr;下面是答案:1).是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。2).是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。3).這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:int square(volatile int*ptr)int a,b;a=
28、*ptr;b=*ptr;return a* b;由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:long square(volatile int*ptr)int a;a=*ptr;return a* a;六、位操作(Bit manipulation)嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a的bit 3,第二個(gè)清除a的bit 3。在以上兩個(gè)操作中,要保持其它位不變。解答:采用#defines和&n
29、bspbit masks操作。這是一個(gè)有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:#define BIT3(0x1 6)? puts( 6): puts(6”。原因是當(dāng)表達(dá)式中存在有符號(hào)類型和無(wú)符號(hào)類型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)類型。因此-20變成了一個(gè)非常大的正整數(shù),所以該表達(dá)式計(jì)算出的結(jié)果大于6。這一點(diǎn)對(duì)于應(yīng)當(dāng)頻繁用到無(wú)符號(hào)數(shù)據(jù)類型的嵌入式系統(tǒng)來(lái)說(shuō)是豐常重要的。2.評(píng)價(jià)下面的代碼片斷:(考查是否懂得處理器字長(zhǎng))unsigned int zero= 0;unsigned int c
30、ompzero= 0xFFFF;/*1s complement of zero*/對(duì)于一個(gè)int型不是16位的處理器為說(shuō),上面的代碼是不正確的。應(yīng)編寫如下:unsigned int compzero=0;這一問題真正能揭露出應(yīng)試者是否懂得處理器字長(zhǎng)的重要性。好的嵌入式程序員非常準(zhǔn)確地明白硬件的細(xì)節(jié)和它的局限,然而PC機(jī)程序往往把硬件作為一個(gè)無(wú)法避免的煩惱。九、TypedefTypedef作用是聲明一個(gè)新的類型名代替已有的類型名;也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子:#define dPS struct s*
31、typedef struct s* tPS;以上兩種情況的意圖都是要定義dPS和 tPS作為一個(gè)指向結(jié)構(gòu)s指針。哪種方法更好呢?(如果有的話)為什么?這是一個(gè)非常微妙的問題,任何人答對(duì)這個(gè)問題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。答案是:typedef更好。思考下面的例子:dPS p1,p2;tPS p3,p4;第一個(gè)擴(kuò)展為struct s* p1, p2;上面的代碼定義p1為一個(gè)指向結(jié)構(gòu)的指,p2為一個(gè)實(shí)際的結(jié)構(gòu),這也許不是你想要的。第二個(gè)例子正確地定義了p3和p4兩個(gè)指針。#define在預(yù)編譯時(shí)處理,只作簡(jiǎn)單的字符串替換;&
32、nbspTypedef在編譯時(shí)處理,不是簡(jiǎn)單的字符串替換;4. static有什么用途?(請(qǐng)至少說(shuō)明兩種)1.限制變量的作用域2.設(shè)置變量的存儲(chǔ)域7. 引用與指針有什么區(qū)別?1) 引用必須被初始化,指針不必。2) 引用初始化以后不能被改變,指針可以改變所指的對(duì)象。2) 不存在指向空值的引用,但是存在指向空值的指針。8. 描述實(shí)時(shí)系統(tǒng)的基本特性在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性9. 全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧10. 什么是平衡二叉樹?左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對(duì)值不大于111. 堆棧溢出一般是由
33、什么原因?qū)е碌??沒有回收垃圾資源12. 什么函數(shù)不能聲明為虛函數(shù)?constructor13. 冒泡排序算法的時(shí)間復(fù)雜度是什么?O(n2)14. 寫出float x 與“零值”比較的if語(yǔ)句。if(x0.&x-0.)16. Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)?tcp/ip 應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層17. Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議?ARP (Address Resolution Protocol)(地址解析協(xié)議)18.IP地址的編碼分為哪倆部分?IP地址由兩部分組成,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。不過(guò)是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)分哪些是網(wǎng)
34、絡(luò)位哪些是主機(jī)位。2.用戶輸入M,N值,從1至N開始順序循環(huán)數(shù)數(shù),每數(shù)到M輸出該數(shù)值,直至全部輸出。寫出C程序。循環(huán)鏈表,用取余操作做3.不能做switch()的參數(shù)類型是:switch的參數(shù)不能為實(shí)型。華為1、局部變量能否和全局變量重名?答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用:局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi)2、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量?答:extern可以用引用頭文件的方
35、式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)3、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么?答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量??梢栽诓煌腃文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)4、語(yǔ)句for( ;1 ;)有什么問題?它是什么意思?答:和while(1)相同。5、dowhile和whiledo有什么區(qū)別?答:前一個(gè)循環(huán)一
36、遍再判斷,后一個(gè)判斷以后再循環(huán)6、請(qǐng)寫出下列代碼的輸出內(nèi)容#includemain()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,1201、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?全 局變量(外部變量)的說(shuō)明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用
37、域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成 時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因 此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。static函數(shù)與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件
38、中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝2、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū) )中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于( 堆)中。3、設(shè)有以下說(shuō)明和定義:typedef union long i; in
39、t k5; char c; DATE;struct data int cat; DATE cow; double dog; too;DATE max;則語(yǔ)句 printf(%d,sizeof(struct date)+sizeof(max);的執(zhí)行結(jié)果是:_52_答:DATE是一個(gè)union, 變量公用空間. 里面最大的變量類型是int5, 占用20個(gè)字節(jié). 所以它的大小是20data是一個(gè)struct, 每個(gè)變量分開占用空間. 依次為int4 + DATE20 + double8 = 32.所以結(jié)果是 20 + 32 = 52.當(dāng)然.在某些16位編輯器下, int可能是2字節(jié),那么結(jié)果是 i
40、nt2 + DATE10 + double8 = 204、隊(duì)列和棧有什么區(qū)別?隊(duì)列先進(jìn)先出,棧后進(jìn)先出5、寫出下列代碼的輸出內(nèi)容#includeint 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
41、(%dn,*arg2);main()int a;show(multi,10,&a);return 0;答:1107、請(qǐng)找出下面代碼中的所以錯(cuò)誤說(shuō)明:以下代碼是把一個(gè)字符串倒序,如“abcd”倒序后變?yōu)椤癲cba”1、#includestring.h2、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=srclen;10、 while(len-!=0) 11、 d+=s-;12、 printf
42、(%s,dest);13、 return 0;14、 答:方法1:int main()char* src = hello,world;int len = strlen(src);char* dest = (char*)malloc(len+1);/要為0分配一個(gè)空間char* d = dest;char* s = &srclen-1;/指向最后一個(gè)字符while( len- != 0 )*d+=*s-;*d = 0;/尾部要加0printf(%sn,dest);free(dest);/ 使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露return 0;方法2:#include #include mai
43、n()char str=hello,world;int len=strlen(str);char t;for(int i=0; ilen/2; i+)t=stri; stri=strlen-i-1; strlen-i-1=t;printf(%s,str);return 0;1.-1,2,7,28,126請(qǐng)問28和126中間那個(gè)數(shù)是什么?為什么?第一題的答案應(yīng)該是43-1=63規(guī)律是n3-1(當(dāng)n為偶數(shù)0,2,4)n3+1(當(dāng)n為奇數(shù)1,3,5)答案:632.用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能?要求給出算法和思路!設(shè)2個(gè)棧為A,B, 一開始均為空.入隊(duì):將新元素push入棧A;出隊(duì):(1)判斷棧B是否為
44、空;(2)如果不為空,則將棧A中所有元素依次pop出并push到棧B;(3)將棧B的棧頂元素pop出;這樣實(shí)現(xiàn)的隊(duì)列入隊(duì)和出隊(duì)的平攤復(fù)雜度都還是O(1), 比上面的幾種方法要好。3.在c語(yǔ)言庫(kù)函數(shù)中將一個(gè)字符轉(zhuǎn)換成整型的函數(shù)是atool()嗎,這個(gè)函數(shù)的原型是什么?函數(shù)名: atol 功 能: 把字符串轉(zhuǎn)換成長(zhǎng)整型數(shù) 用 法: long atol(const char *nptr); 程序例: #include #include int main(void) long l; char *str = ; l = atol(lstr); printf(string = %s integer = %
45、ldn, str, l); return(0); 2.對(duì)于一個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C+中應(yīng)用什么實(shí)現(xiàn)?c用宏定義,c+用inline3.直接鏈接兩個(gè)信令點(diǎn)的一組鏈路稱作什么?PPP點(diǎn)到點(diǎn)連接4.接入網(wǎng)用的是什么接口?5.voip都用了那些協(xié)議?6.軟件測(cè)試都有那些種類?黑盒:針對(duì)系統(tǒng)功能的測(cè)試 白合:測(cè)試函數(shù)功能,各函數(shù)接口7.確定模塊的功能和模塊的接口是在軟件設(shè)計(jì)的那個(gè)隊(duì)段完成的?概要設(shè)計(jì)階段8.enum stringx1,x2,x3=10,x4,x5,x;問x= 0x,0x8010f4 ;9.unsigned char *p1;unsigned long *p2;
46、p1=(unsigned char *)0x;p2=(unsigned long *)0x;請(qǐng)問p1+5= ;p2+5= ;三.選擇題:1.Ethternet鏈接到Internet用到以下那個(gè)協(xié)議?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID2.屬于網(wǎng)絡(luò)層協(xié)議的是:A.TCP;B.IP;C.ICMP;D.X.253.Windows消息調(diào)度機(jī)制是:A.指令隊(duì)列;B.指令堆棧;C.消息隊(duì)列;D.消息堆棧;4.unsigned short hash(unsigned short key)return (key)%256請(qǐng)問hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.32四.找錯(cuò)題:1.請(qǐng)問下面程序有什么錯(cuò)誤?int a602501000,i,j,k;for(k=0;k=1000;k+)for(j=0;j250;j+)for(i=0;i60;i+)aijk=0;把循環(huán)語(yǔ)句內(nèi)外換一下2.#define Max_CB 500void LmiQueryCSmd(Struct MSgCB * pmsg)unsigned char ucCmdNum;.for(ucCmdNum=0;ucCmdNumMax_GT_Length)return GT_Length_ERRO
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 半價(jià)咖啡活動(dòng)策劃方案(3篇)
- 烘培設(shè)計(jì)施工方案(3篇)
- 物資缺貨應(yīng)急預(yù)案(3篇)
- 砌墻頂部施工方案(3篇)
- 稅務(wù)機(jī)房應(yīng)急預(yù)案(3篇)
- 管道臨時(shí)施工方案(3篇)
- 給料機(jī)安裝施工方案(3篇)
- 老年醫(yī)院應(yīng)急預(yù)案(3篇)
- 藝術(shù)天棚施工方案(3篇)
- 蜂窩鋁門施工方案(3篇)
- 電商平臺(tái)消費(fèi)者權(quán)益保護(hù)政策
- 年度采購(gòu)合同框架協(xié)議
- 14J936變形縫建筑構(gòu)造
- TD/T 1012-2016 土地整治項(xiàng)目規(guī)劃設(shè)計(jì)規(guī)范(正式版)
- 《繼電保護(hù)智能運(yùn)維檢修 第5部分:在線監(jiān)測(cè)站端信息描述》
- 動(dòng)物園市場(chǎng)競(jìng)爭(zhēng)中的差異化策略
- 氣錘計(jì)算方法
- 人力資源服務(wù)機(jī)構(gòu)管理制度
- 聯(lián)合利華中國(guó)公司銷售運(yùn)作手冊(cè)
- 電氣二次設(shè)備定期工作標(biāo)準(zhǔn)
- 銀行開戶單位工作證明模板
評(píng)論
0/150
提交評(píng)論