華清遠見成都中心-C語言筆試題答案_第1頁
華清遠見成都中心-C語言筆試題答案_第2頁
華清遠見成都中心-C語言筆試題答案_第3頁
華清遠見成都中心-C語言筆試題答案_第4頁
華清遠見成都中心-C語言筆試題答案_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言筆試題答案

一、簡答題

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

(堆)中。

2.設(shè)有以下說明和定義:

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

structdata{intcat;DATEcow;doubledog;}too;

DATEmax;

貝1」語句printfC^d';sizeoftstructdate)+sizeof(max));的執(zhí)行結(jié)果是:

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

它的大小是20。

data是一個struct,每個變量分開占用空間.依次為int4+DATE20+doubles=32.所以結(jié)

果是20+32=52.

3.32位系統(tǒng)下,請問如下語句的值

unsignedchar*pl;

unsignedlong*p2;

pl=(unsignedchar*)0x801000;

p2=(unsignedlong*)0x810000;

請問pl+5=0x801005

p2+5=0x810014

4.inti=10J=10,k=3;k*=i+j;k最后的值是?

答:60,此題考察優(yōu)先級,實際寫成:k*=(i+j);,賦值運算符優(yōu)先級最低

5.#defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?

答案:i為30o

6.下面程序的輸出是,為什么?

char*ptr;

if((ptr=(char*)malloc(0))==NULL)

(

puts("Gotanullpointer");

)

else

(

puts("Gotavalidpointer");

)

答:Gotavalidpointe

當(dāng)malloc分配內(nèi)存時它除了分配我們指定SIZE的內(nèi)存塊,還會分配額外的內(nèi)存來存儲

我們的內(nèi)存塊信息,用于維護該內(nèi)存塊。因此,malloc(0)返回一個合法的指針并指

向存儲內(nèi)存塊信息的額外內(nèi)存,我們當(dāng)然可以在該內(nèi)存上進行讀寫操作,但是這樣做了

會破壞該內(nèi)存塊的維護信息,因此當(dāng)我們調(diào)用free(ptr)時就會出現(xiàn)錯誤

在MSDN可以找到答案

原話是

"Ifsizeis0,mallocallocatesazero-lengthitemintheheapandreturnsavalidpointe

rtothatitem"

如果申請內(nèi)存大小為0,還是會返回一個有效指針

返回指針為NULL的條件是申請一定大小內(nèi)存,內(nèi)存空間不夠的時候

7.以下程序運行后的輸出結(jié)果是。

main()

(

charm;

m='B'+32;printf("%c\rT,m);

)

答:b

8.已有定義如下:

structnode

(

intdata;

structnode*next;

)*P;

以下語句調(diào)用malloc函數(shù),使指針p指向一個具有structnode類型的動態(tài)存儲空間。

請?zhí)羁誴=(structnode*)malloc();

答:sizeof(structnode)

9.在絕對地址OxXXXXXXXX上寫入字符H的語句是。

答:unsignedchar*p=(unsignedchar*)OxFOOOFFOO;

*P=

10.用預(yù)處理指令#define聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題),

#defineSECONDS_PER_YEAR(60*60*24*365)UL

1)define語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)

2)懂得預(yù)處理器將為你計算常數(shù)表達式的值,因此,直接寫出你是如何計算一年中有

多少秒而不是計算出實際的值,是更清晰而沒有代價的。

3)意識到這個表達式將使?個16位機的整型數(shù)溢州-因此要用到長整型符號L,告訴編

譯器這個常數(shù)是的長整型數(shù)。

4)如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。

記住,第一印象很重要。

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

#defineMIN(A,B)((A)<=(B)?(A):(B))

1)標(biāo)識#define在宏中應(yīng)用的基本知識。這是很重要的。因為在嵌入(inline)操作符變

為標(biāo)準(zhǔn)C的一部分之前,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為

了能達到要求的性能,嵌入代碼經(jīng)常是必須的方法,

2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比

if-then-else更優(yōu)化的代碼,了解這個用法是很重要的。

3)懂得在宏中小心地把參數(shù)用括號括起來,因為#define僅僅做替換,如果我們寫

#defineMUL(a,b)a/b的話,那么我寫MUL(a+l,b?l)替換之后的表達式就為a+1/替工,

這個結(jié)果顯然是違背我們定義的目的的。

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

這個問題用幾個解決方案。

while(l){}或者for(;;){}

13.用變量a給出下面的定義

a)—*個整型數(shù)(Aninteger)

b)一個指向整型數(shù)的指針(Apointertoaninteger)

c)?個指向指針的的指針,它指向的指針是指向■個整型數(shù)(Apointertoapointerto

anintege)

d)一個有10個整型數(shù)的數(shù)組(Anarrayof10integers)

e)一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(Anarrayof10pointersto

integers)

f)一個指向有10個整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)

g)一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(Apointertoa

functionthattakesanintegerasanargumentandreturnsaninteger)

h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返同一

個整型數(shù)(Anarrayoftenpointerstofunctionsthattakeanintegerargumentand

returnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

e)int*a[10];//Anarrayof10pointerstointegers

f)int(*a)[10j;//Apointertoanarrayof10integerssizeof(a)=4;sizeof(*a)=40;

g)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsan

integer

h)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentand

returnaninteger

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

全局變量(外部變量)的說明之前再冠以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

inta,b;

a=*ptr;

b=*ptr;

returna*b;

)

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代只可能

返不是你所期望的平方值!正確的代碼如下:

longsquare(volatileint*ptr)

(

inta;

a=*ptr;

returna*a;

)

20.在某工程中,要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa660編譯器是一個

純粹的ANSI編譯器.寫代碼去完成這一任務(wù)。

答:

int*ptr;

ptr=(int*)0x67a9;

*ptr=0xaa55;

21.局部變量能否和全局變量重名?

答:能,局部會屏蔽全局。要用全局變量,需要使用“:局部變量可以與全局變量同

名,在函數(shù)內(nèi)引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有

些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變量,比如在兩個循環(huán)體內(nèi)都

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

22.如何引用一個已經(jīng)定義過的全局變量?

答:extern

可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某

個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果

你用extern方式引用時,,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連

接期間報錯。

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

答:可以,在不同的(:文件中以static形式來聲明同名全局變量。可以在不同的C文件

中聲明同名的全局變量,前提是其中只能有一個C叉件中對此變量賦初值,此時連接不

會出錯.

24.語句for(:1:)有仆么問題?它是什么意思?

答:和while(l)相同,死循環(huán)。

25.d。.while和while......do17什么區(qū)別?

答:前一個循環(huán)一遍再判斷,后一個判斷以后再循環(huán)。

26.下列哪種方法更好,為什么?

definedPSstructs*

typedefstructs*tPS;

以上兩種情況的意圖都是要定義dPS和tPS作為一個指向結(jié)構(gòu)s指針。哪種方法更好

呢?(如果有的話)為什么?

這是一個非常微妙的問題,任何人答對這個問題(正當(dāng)?shù)脑?是應(yīng)當(dāng)被恭喜的。答案

是:typedef更好。思考下面的例子:

dPSpl,p2;

tPSp3,p4;

第一個擴展為

structs*plzp2;

上面的代碼定義pl為一個指向結(jié)構(gòu)的指,p2為一個實際的結(jié)構(gòu),這也許不是你想要的。

第二個例子正確地定義了p3和p4兩個指針。

27.下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?

inta=5,b=7,c;

c=a+++b;

根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理

成:

c=a+++b;

因此,這段代碼持行后a=6,b=7,c=12c

28.隊列和棧有什么區(qū)別?

隊列先進先出,棧后進先出

29.全局變量和局部變量是否有區(qū)別?如果有,是什么區(qū)別?

全局變最儲存在靜態(tài)數(shù)據(jù)庫,局部變最在堆棧。

全局變量的作用域在定義之下的任何位置

而局部變量的作用域在函數(shù)模塊內(nèi)

全局變量的生命周期從編譯開始到程序結(jié)束

而局部變量的聲明周期從定義開始到函數(shù)結(jié)束

30.堆棧溢出一般是由什么原因?qū)е碌模?/p>

沒有回收垃圾資源。

31.冒泡排序算法的時間賽雜度是什么?+

時間復(fù)雜度是O(N2)。

32.分別寫出BOOL,int,float,指針類型的變量a與“零〃的比較語句。

答案:

BOOL:if(!a)orif(a)

int:if(a==0)

float:constEXPRESSIONEXP=0.000001

if(a<EXP&&a>-EXP)

pointer:if(a!=NULL)orif(a==NULL)

33.不能做switch。的參數(shù)類型是:

switch的參數(shù)不能為實型。

34.某32位系統(tǒng)下,請L算sizeof的值.

charstr[]="http:〃/"

char*p=str;

intn=10;

請計算

sizeof(str)=?(1)

sizeof(p)=?(2)

sizeof(n)=?(3)

voidFoo(charstr[100]){

sizeof(str)=?(4)

)

void*p=mallocf100);

sizeof(p)=?(5)

答:(1)字符串末尾有‘\0'字符,所以是17

(2)4

(3)4

(4)str是指針而并非數(shù)組,所以是4,在形參中不能定義數(shù)組,所有以數(shù)組形式出

現(xiàn)的都是指針

(5)p的類型是指針?biāo)允?

35.請說出const與#defire相比,有何優(yōu)點?

答:

1)const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全

檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料

不到的錯誤。

2)有些集成化的調(diào)試工具可以對const常量進行調(diào)試,但是不能對宏常量進行調(diào)試。

36.回答下面的問題.

a)頭文件中的ifndef/define/endif干什么用?預(yù)處理

答:防止頭文件被重復(fù)引用

b)#include<filename.h>fO#include"filename.h”有什么區(qū)別?

答:前者用來包含開發(fā)環(huán)境提供的庫頭文件,后者用來包含自己編寫的頭文件。

37.使用malloc()函數(shù)時,為什么要將其返回值強制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類型?

答:因為malloc返回值為void*型指針,對于void*型指針必須先強制類型轉(zhuǎn)換才能夠

使用。

38.列舉?個軟件中時間換空間或者空間換時間的例子。

答:

voidswap(intajntb)

(

intc;c=a;a=b;b=a;

)

空間換時間

voidswapfinta,intb)

(

a=a+b;b=a-b;a=a-b;

)

39.以下C語言語句有什么區(qū)別

char*constp;

charconst*p;

constchar*p;

答:

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

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

constchar*p:〃和charconst*p

40.下面x,y,*p的值是多少,有什么問題?

intx,y,z=2;

int*p=&z;

x=sizeof*p;

V=x/*p;

答:如果你按這個寫出來,肯定編譯不過去。最明顯的:y=x/*p;應(yīng)該改為y=x/(*p)

還有sizeof*p改為sizeof(*p);

y=2,x=4,z=2,*p=2;

41.下面的語句是什么意思?如何聲明或定義才使它們更易懂?(10分)

int(*foo())();*foo()為一指針函數(shù),inta()函數(shù)

int(*foo())[];*foo()為一指針函數(shù),inta。數(shù)組

int(*foo[])();*foo口為一指針數(shù)組,inta()函數(shù)

(*(void(*)())0)();void(*)()為一函數(shù)指針,⑶0,數(shù)據(jù)類型轉(zhuǎn)換,(*a川函數(shù)指針

void(*signal(int,void(*)(int)))(int);

void(與(int)函數(shù)指針,*signal(int,a)指針函數(shù),voidb(int)函數(shù)

答:

第一個:int(*foo())();

先一步一步的分析:首先是被左邊的()括起來的*匕。()。

(1)里面()的優(yōu)先級高于*,所以foo()先是一個函數(shù);

⑵*foo()說明這個函數(shù)返回一個指針;

(3)(*foo())()這個函數(shù)返回的指針指向一個函數(shù);

(4)int(*foo())();

(5)最后這個函數(shù)返回一個整型數(shù)。

第二個:int(*foo(皿;

有上面的打基礎(chǔ)了,這回好多了。大致還是那個意思,但是就是由函數(shù)變成了數(shù)組,

所以還更簡單些,具體的含義是:f。")函數(shù)返回的指針指向一個具有整型數(shù)的數(shù)組。

第三個:int(*foo[])();

這個就是上兩個的翻版:一個存有指針的數(shù)組葉。???,該指針指向一個函數(shù),該函

數(shù)返回一個整型數(shù)。

第四個:(*(void(*)())0)();

(1)最里面的(*)()意思是一個指向函數(shù)的指針;

(2)加個前綴void(>(),表示一個指向返I口I類型為void的函數(shù)的指針;

(3)套個馬甲(void(*M))的意思就是類型強制轉(zhuǎn)換:

(4)(void(*)())0就是把0強制轉(zhuǎn)換成前面說的那個類型的指針;

(5)那么好,現(xiàn)在(void(*)())0是一個指計了,這個指針指向了一個函數(shù),我任用宏

定義簡化一下,看著太麻煩:

(6)#defineptr(void(*)())0,現(xiàn)在(*(void(*)())0)();這個怪物就可以簡化成:(*ptr");

(7)別忘了ptr是一個指向函數(shù)的指針,既然這樣*ptr就是函數(shù)了,那么上面的結(jié)

果再次被簡化成:ptr();,這不就是函數(shù)的調(diào)用么!

至此這個怪物函數(shù)的含義和簡化形式就都給出了,我就不再總結(jié)了。不過我還想再

給出一個簡化形式,這會對下面的問題有啟示:

使用typedef,typedefvoid(*ptij();,然后就可以用(*(ptr)O)();來表示這個怪物函數(shù)

了,其靈活性比使用#€12例€要高。

第五個:

void(*signal(intzvoid(*)(int)))(int);

這是著名的signal函數(shù)的原型,可以如此聲明:

typedefvoid(*H^NDLER)(int);

HANDLERsignal(int,HANDLER);

或者:

typedefvoidHANDLER(int);

HANDLER*signal(int,HANDLER*);

42.如何定義Bool變量的TRUE和FALSE的值。

答:#defineTURE1

#defineFALSE0

43.運行chara[]=〃abc〃后,內(nèi)存會開辟幾塊內(nèi)存,這此內(nèi)存共占多少個字節(jié)?

答:這句話為定義數(shù)組,省略下表后根據(jù)元素個數(shù)決定,因為“abc”為字符串,加上

末尾’\0'共有4個元素所以是四個字節(jié)。

44.運行char*p=〃abc"后,內(nèi)存會開辟幾塊內(nèi)存,這此內(nèi)存共占多少個字節(jié)?

答:這句話為定義指計指向字符串常量區(qū)字符串“abc”,任何指針都為4個字節(jié),所以

共占4個字節(jié)。

45.說出⑶;p是什么變量?如果p是指針變量,那么p+1的偏移量是多少?

答:P為指針變量,P指向類型為裝了三個元素的指針數(shù)組,因為所有指針在32位系

統(tǒng)下都是四個字節(jié),所以偏移量為12個字節(jié)。

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

答:32位

47.已知一個數(shù)組table,用一個宏定義,求出數(shù)據(jù)的元素個數(shù)

答:ttdefinelength(table)(sizeof(table)/sizeof(table[0]?

二、程序分析題

1.下面的代碼有什么問題?

char*_strdup(constchar*strSource)

staticcharstr[MAX_STR_LEN];

strcpy(stcstrSource);

returnstr;

)

答:返I可局部變量地址。

2.下面的代碼輸出是什么,為什么?

voidfoo(void)

(

unsignedinta=6;

intb=-20;

(a+b>6)?puts(">6"):puts("<=6");

)

答:這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極

少這些東西。不管如何,這無符號整型問題的答案是輸出是”>6,原因是當(dāng)表達式中

存在有符號類型和無符號類型時所有的操作數(shù)都自動轉(zhuǎn)換為無符號類型。因此-20變成

了一個非常大的正整數(shù),所以該表達式計算出的結(jié)果大于6。

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

#include

main{)

(

?nta,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printff'b,c,d:%d,%d,%d",b,c,d);

return0;

)

答:10,12,120

4.lest函數(shù)的運行結(jié)果如何?

voidGetMemory(char*p)

(

p=(char*)malloc(100);

)

voidTest(void)

(

char*str=NULL;

GetMemory(str);

strcpyfstr,"helloworld");

printf(str);

)

答:段錯誤,GetMemory(str)傳的是str地址并沒有改變str的值,所以p并不能夠

改變str的指向,str依然是NULL,strcpy向NULL賦值造成段錯誤。

5.Test函數(shù)的運行結(jié)果如何?

char*GetMemory(void)

charp[]="hellov/orld";

returnp;

)

voidTest(void)

(

char*str=NULL;

str=GetMemoryl);

printf(str);

)

答:返回局部變量地址。

6.Test函數(shù)的運行結(jié)果如何?

VoidGetMemory2(char**p,intnum)

(

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

)

voidTest(void)

(

char*str=NULL;

GetMemoryf&str,100);

strcpy(str,"hello");

printf(str);

)

答:內(nèi)存溢出,malloc申請的空間使用結(jié)束之后沒有釋放

7.Test函數(shù)的運行結(jié)果如何?

voidTest(void)

(

char*str=(char4)malloc(lOO);

strcpy(str,"hello");

free(str);

if(str!=NULL)

(

strcpy(str,"world");

printf(str);

)

)

答:一內(nèi)存溢出,二free釋放malloc申請的內(nèi)存空間之后繼續(xù)操作該空間,但是該程

序能夠打印出world但是操作是非法的。

8.寫出下列代碼的輸出內(nèi)容

#indude

intinc(inta)

(

return(++a);

)

intmulti(int*a,int*b,int*c)

return(*c=*a**b);

)

typedefint(FUNCl)(intin);

typedefint(FUNC2)(int*Jnt*zint*);

voidshow(FUNC2fcnjntargl,int*arg2)show(multi,10.&a)

(

INCp=&inc;

inttemp=p(argl);

funt&temp^argl,arg2);

printf("%dn"/arg2);

)

main()

(

inta;

show(multi,10,&c);

return0;

)

答:110

9.請找出下面代碼中的所以錯誤

說明:以下代碼是把一個字符串倒序,如"abed”倒序后變?yōu)?dcba〃

#include"string.h"

main()

(

char*src="hello/world";

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*sre="heIo,world";

intlen=strlen(src);

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

char*d=dest;

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

while(len-!=0)

*d++=*s—;

*d=0;〃尾部要加0

printf(”%sn”,dest);

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

return0;

)

方法2:

Intmain()

(

charstr[]="hello/world";

intlen=strlen(str);

chart;

for(inti=0;i{

t=str[i];

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

)

printf("%s",str);

return0;

)

10.以下程序有什么錯誤

試題1:

voidtestlf)

(

charstring[10];

char*strl="0123456789";

strcpy(string,strl);

)

答:數(shù)組越界string數(shù)組只有十個元素空間,字符串strl有11個字節(jié)

試題2:

voidtest2()

(

charstring[10]zstrl[10];

inti;

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

(

strl='a";

)

strcpyfstring,strl);

)

答:有可能造成數(shù)組越界,stC里所有元素都是字符‘a(chǎn)',strcpy及制遇到‘\0'才會

停止,而strl數(shù)組里沒有字符串結(jié)束標(biāo)志'\01所以有可能造成數(shù)組越界。

試題3:

voidtest3(char*strl)

(

charstring[10];

if(strlen(strl)<=10)

(

strcpy(string,strl);

}

)

答:if(strlen(strl)<=10)應(yīng)改為if(strlen(strl)<10),因為strlen的結(jié)果未統(tǒng)計所占用

的1個字節(jié)。

11.下面程序的運行結(jié)果:

main()

(

inta[5]={lz2,3A5};

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

printf("%d/%d"/*(a+l)/*(ptr-l));

)

答:2,5

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

intmain()

(

chara;char*str=&a;

strcpy(str,"hello");

printf(str);

return0;

)

答:沒有為str分配內(nèi)存空間,將會發(fā)生異常問題出在將一個字符串復(fù)制進一個字符變

最指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因為越界進行內(nèi)在讀寫而導(dǎo)致程序崩潰。

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

答:

a=aAb;

b=aAb;

a=aAb;

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

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

inta=5;

intb;

b=SQUARE(a++);

答:要寫成inta=5;a++;b=SQUARE(a),不然直接傳a++的值還是5。

15.下面的程序運行結(jié)果是()

設(shè)

intarr[]={6/7,8,9,10);

int*ptr=arr;

(ptr++)+=123;//

print—"%d,%dM,*ptr,*(++ptr));

答:8,8

16.下面的兩段代嗎?有什么區(qū)別?什么時候需要使用代碼2?

1、

inti=10;

intj=i;

intk=i;

2、

volatileinti=10;

intj=i;

intk=i;

答:代碼1,這時候編譯器對代碼進行優(yōu)化,因為在代碼1中的兩條語句之間i沒有被

用作左值(即沒有被賦值),這時候編譯器認為i的值沒有發(fā)生改變,所以在第1條語

句時從內(nèi)存取出i的值賦給j之后,這個值并沒有被丟掉,而在第2條語句時,繼續(xù)用

這個值給k賦值。編譯器不會生成匯編代碼重新從內(nèi)存讀取i的值。

代碼2,volatile關(guān)鍵字告訴編譯器,i是隨時可能發(fā)生的變化的,每次使用它的時候,

必須從內(nèi)存中取出i的值。因而編譯器生成的匯編代碼會重新從i的地址處讀取數(shù)據(jù)放

在k中。

代碼2,的使用時機,如果i是一個寄存器變量,表示一個商品數(shù)據(jù)或者是多個線程的

共享數(shù)據(jù),那么就容易出錯,所以說volatile可以保證對特殊地址的穩(wěn)定訪問。

17.printf("%d",OxOl?2+3);輸出?

答:7。〃應(yīng)該為32,因為在操作符的優(yōu)先級中,算術(shù)操作符的優(yōu)先級高于移位運算操

作符的優(yōu)先級

18.在32位的X86系統(tǒng)下,輸出的值為多少?

include<stdio.h>

intmain()

(

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

int*ptrl=(int*)(&a+1);

int*ptr2=(int*)((int)a+1);

printf("%d,%x",p:rl[-l],*ptr2);

〃注意從高字節(jié)開始打印

return0;

)

答:5,2

19.下面代碼的有問題嗎?為什么?

include<stdio.h>

voidfunc(chara(10])/相當(dāng)于voidfunc(char*a)

(

charc=a[3];

}

intmain()

(

charb[10]="abcdefg";

func(b[10]);

return0;

)

答:這里至少有兩上嚴(yán)重錯誤,

第一,b[10]并不存在,在編譯的時候,由于沒有去實際地址取值,所以沒有出錯。但

在運行的時,

將計算b[10]的實際地址,并且取值。這時候發(fā)生越界錯誤。

第二,func函數(shù)會將傳入的char類型的數(shù)據(jù)當(dāng)作地址處理,同樣會發(fā)生錯誤。

20.下面代碼輸出的結(jié)果是多少?

#include<stdio.h>

voidfun(inti)

(

if(i>0)

(

fun(i/2);

)

printf("%d\n"J);

)

intmain()

(

fun(10);

return0;

)

答:0,1,2,5,10析:遞歸展開

三、編程題

1.不調(diào)用庫函數(shù),自己實現(xiàn)memcpy困數(shù)。

typedefintsize_tt;

〃源串要有修飾

void*memcpy(void*dest,constvoid*srczsize_ttcount)const

(

char*pDest=(char*)(dest);〃將原始指針賦給新變量

constchar*pSrc=(constchar*)(src);

〃判斷傳參是否合法

if(NULL==dest11NULL==src)

(

returnNULL;

)

〃目的地址和源地址重疊,從源地址的末尾方向開始拷貝

if(pDest>pSrc&&pDest<pSrc+count)

〃將指針指向末尾

pDest=pDest+count-1;

pSrc=pSrc+count-1;

while(count-)

*pDest--=*pSrc--;

)

)

〃目的地址和源地址不重疊,從源地址的開始方向拷貝

else

(

while(count-)

(

*pDest++=*pSrc++;

)

)

returnpDest;〃返I可,這樣可以嵌套使用

}

2.不調(diào)用庫函數(shù),自己實現(xiàn)strcpy函數(shù)。

intStrcmp(constchar*strl,constchar*str2)

(

assert(strl&&srt2);

while(*strl&&*str2&&(*strl==*str2))

(

strl-i-+;

str2++;

}

return(*strl-*str2);

)

3.

a)編寫strcat函數(shù),已知strcat函數(shù)的原型是char*strcat(char*strDest,constchar

*strSrc);其中strDest是目的字符串,strSrc是源字符串(不能調(diào)用庫函數(shù))。

include<stdio.h>

char*strcat(char*dst,constchar*src)

{

if(NULL==dst11NULL==src)

{

returnNULL;

)

char*cp=dst;

whilef*cp)

cp++;/*findendofdst*/

while(*cp++=*src++);/*Copysrctoendofdst*/

returndst;/*returndst*/

)

intmain()

(

charstrl[100]="helloworld";

charstr2[]="Jt'sbeautiful!";

printf("%s\n”,strcat(strl,st⑵);

return0;

)

b)strcat能把strSrc的內(nèi)容連接到strDest,為什么還要char*類型的返回值?

答:方便賦值給其他變量

4.兩個字符串,s,t;把t字符串插入到s字符串中,s字符串有足夠的空間存放t字符串。

char*insert(char*t,constchar*s)

(

char*q=t;

constchar*p=s;

if(NULL==q]

returnNULL;

while(*p!='\0')

{

P++;

)

while(+q!=0)

(

*p=*q;

P++;

q++;

)

*P='\0';

returnt;

)

5.寫一函數(shù),實現(xiàn)刪除字符串strl中含有的字符串str2。

ftinclude<stdio.h>

char*delstr(char*src,constchar*sub)

(

char*st=src,*sl=NULL;

constchar*s2=NULL;

while(*st&&*sub)

si=st;

s2=sub;

while(*sl&&*s2&&!(*sl-*s2))

(

sl-+;

s2-+;

)

if(I*s2)

(

while(*st++=*sl++);

st=src;

)

st++;

)

return(src);

)

intmain()

(

charstrl[]="nihaowodepengyou";

charstr2[]="hao";

printf("%s\n",delstr(strl,st⑵);

return0;

}

6.編程,判斷存儲方式是大端存儲,還是小端存儲,并說出為什么要進行大小端的判定?

intcheck_little_endian()

(

union{

inta;

charb;

)c;

c.a=l;

return(c.b==1);

)

intcheck_little_endian()

(

inti=0x00000001;

char*p=&a;

return*P;

)

staticunion

(

charc[4];

unsignedlongI;

}endian_test={{'l';?7?7b,}};

"defineENDIANNESS((char)endian_test.l)

7.不調(diào)用庫函數(shù),自己實現(xiàn)longatol(constchar*nptr)函數(shù)。

long_cdeclatol(constchar*nptr)/*1.const修飾*/

(

intc;/*currentchar*/

longtotal;/*currenttotal*/

intsign;/*ifthennegative,otherwisepositive*/

/*skipwhitespace*/

/?char,signedcharunsignedchar類型的數(shù)據(jù)具有相同的特性然而當(dāng)你把一

個單字節(jié)的數(shù)賦給一個整型數(shù)時,便會看到它們在符號擴展上的差異。*/

/*ascii碼當(dāng)賦給整形數(shù)時要轉(zhuǎn)為unsignedchar再轉(zhuǎn)為int*/

while(isspace((int)(unsignedchar)*nptr))/*2.去掉首部的空格*/

++nptr;

c=(int)(unsignedchar)*nptr++;/*取得第一個非空格的字符*/

sign=c;/*savesignindication*/

if(c==c=='+')〃如果笫一個非空格字符為符號”/

c=(int)(unsignedchar)*nptr++;/*skipsign*/

/*跳過符號,將符號后的那個字符給c*/

total=0;/*結(jié)果置為0*/

while(isdigit(c)){/*3.如果碰到非法字符則停止*/

total=10*total+(c-'0');/*accumulatedigit*/

c=(int)(unsignedchar)*nptr++;/*getnextchar*/

)

if(sign==

return-total;

else

returntotal;/*returnresult,negatedifnecessary*/

}

8.編寫strcat函數(shù)0。已知strcat函數(shù)的原型是char*str:at(char*strDest,constchar*strSrc);

其中strDest是目的字符串,strSrc是源字符串。

a)不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù)strcato

char*_cdeelstrcat(char*dst,constchar*sre)

{

insert(dest!=NULL&&sre!=NULL);

char*cp=dst;

whilef*cp)

cp++;/*findendofdst*/

while(*cp++=*src++);/*Copysretoendofdst*/

return(dst);/*returndst*/

)

b)strcat能把strSrc的內(nèi)容連接到strDest,為什么還要char*類型的返回值?

答:方便賦值給其他變量

9.寫一個函數(shù),它的原形是intcontinumax(char*outputstr,char*intputstrj。功能:在字符串

中找出連續(xù)最長的數(shù)字串,并把這個串的長度返回,并把這個最長數(shù)字串付給其中一個

函數(shù)參數(shù)outputstr所指內(nèi)存。例如:"abcdl2345edl25ssi23456789”的首地址傳給

intputstr后,函數(shù)將返回9,outputstr所指的值為123456789

intcontinumax(char*outputstr,char*inputstr)

(

char*in=inputstr,*out=outputs"*temp,“final;

intcount=0,maxlen=0;

while(*in!='\0')

(

if(*in>47&&*in<58)

(

for(temp=in;*in>47&&*in<58;in++)

count++;

)

else

in++;

if(maxlen<count)

(

maxlen=count;

count=0;

final=temp;

)

)

for(inti=0;i<maxlen;i++)

*out=*final;

out++;

final++;

)

*out='\0';

returnmaxlen;

)

10,不用庫函數(shù),用C語言實現(xiàn)將一整型數(shù)字轉(zhuǎn)化為字符串。

intgetlen(char*s)

(

intn;

for(n=0;*s!='\0';s++)

n++;

returnn;

)

voidreverse(chars[])

(

intc,i,j;

for(i=0J=g2tlen(s)-1;i<j;i++J-)

(

c=s[i];

s[i]=s[j];

sUl=c;

)

)

voiditoa(intn,chars[])

(

inti,sign;

if((sign=n)<0)

n=-n;

i=0;

do{/*以反序生成數(shù)字*/

s(i++]=n%10+'O';/*getnextnumber*/

}while((n/=10)>0);/*deletethenumber*/

if(sign<0)

s[i++]=

s[i]='\0';

reverse(s);

)

#inclu

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論