版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、寫出下列程序片段的輸出結(jié)果staticvoidtest1(){stmctnode{mta;charb;chai-c;mtd;mte;};structnodes={3,4,5,6};stmctnode*p=&s;pnntf(M%dir\*((mt*)p+3));//0piintf(,,%d\n,\((int*)p+4)[-l]);//0}〃 *)p+4)-l)//====—======staticvoidtest2(){nita[]={1,2,3,4,5};int*p=(int*)(&a+1);//&a的類型是int(*)[5],&a指向的類型是mt[5]pnnrf(”%d%d\n”,*(a+1),*(p-1));//25}staticvoidfbo(intb[][3])//int(*)[3J{b++;b[l][l]=100;}staticvoidtest3(){inta[][3]={{1,2,3},{4,5,6},{7,8,9}};foo(a);pnntf(,,%dii",a[2][l]);//100}staticvoidtest4(){inta[][3]={l,2,3,4,5,6};int(*p)[3]=a;pnntf(”%d%dm”,(*p)[l],(*p)[2]);〃*(*p+l)〃23p卄;pnntf(M%d%d\iT;(*p)[l],(*p)[2]);//56}!hstaticvoidfool(mtint*q){inttmp=*p;*p=*q;*q=tmp;}staticvoidfoo2(mtint*q){int*tmp=p;p=q;q=tmp;}staticvoidtest5(){inta=3;mtb=5;void(*p[2])(iiit*,int*);p[0]=fool;p[l]=foo2;p[0](&a,&b);printf(M%d a,b);//53p[l](&a,&b);printf(M%d a,b);//53}staticvoidtest6(){inta=3;intb=5;void(*s[2])(iiit*,int*);void(*(*p)[2])(int*,int*)=&s;s[0]=fool;s[l]=foo2;s[0](&a,&b);printf(M%d%diT;a,b);//53printf(M%d%diT;a,b);//53}//=======—=======voidfl(iiit iiit);voidf2(iiit iiit);void(*p[2])(iiitmt);staticvoidtest7(){inta;iiitb;p[0]=fl;p[l]=f2;a=3;b=5;p[0](&a,b);printf(H%d\t%d\f\a,b);//55p[l](&a,b);printf(H%d\t%d\f\a,b);//55}voidfl(int*p,iiitq){inttmp;tmp=*p;*p=q;q=tmp;}void£2(int*p、intq){inttmp;tmp=*p;*p=q;q=tmp;}這段程序的輸出是:5555fl交換*p和q的值,fl執(zhí)行完后,*p和q的值的確交換了,但q的改變不會影響到b的改變,*p實(shí)際上就是a,所以執(zhí)行fl后,a=b=5這道題考查的知識范圉很廣,包括函數(shù)指針,指針數(shù)組void(*p[2])(iiit*,mt);定義了一個函數(shù)指針的數(shù)組p.p有兩個指針元素.元素是函數(shù)的指針,函數(shù)指針指向的函數(shù)是一個帶2個參數(shù),不返回任何類型值的函數(shù),所帶的兩個參數(shù)分別是指向整型的指針,和整型p[0]=fl;p[l]=£2containaddressoffunction.fiinctionnamewithoutparenthesisrepresentaddressoffiuictionValueandaddressofvanableispassedtofunctiononlyargumentthatiseffectedisa(addressispassed).Becauseofcallbyvaluefl,f2cannoteffectbstaticvoidtest8(){//unsignedcliarbuf[15]={1,2,3,4,5,6,7,8};unsignedcharbuf(l5]={T,2,3;4;95\96\7,8};unsignedcharc;pnntf(M%dir\c);Hl55pnntf(M%dir\(mt)c);〃755pmitfT%x\iT;*(mt*)(buf+1));//504030235343332}//=======―=======staticvoidfoo(char**p){char*t=0;//defineNULL(void*)0t=(p+=sizeof(mt))[-l];pmirfT%s\n”,t);}staticvoidtest9(){chai-*argv[]={,fab”,”cd”, ;”gh”, };fdo(aigv);printf(M%dii,\sizeof(aigv));〃4*6、argv的類型是char*[6]}//sizeof(int)的值是4,所以p+=sizeof(mt)指向argv[4],這點(diǎn)估計(jì)人家都沒有什么疑問;//(p^=sizeof(mt))[-1]指向argv[3],因?yàn)?p+=sizeof(int))[-l]就相當(dāng)于(p+=4)[-l],也就是(P+4-1)staticvoidtest10(){chaia[3][2]={0};//a充當(dāng)右值時自動轉(zhuǎn)化為指向首元素的指針,類型是chai(*)[2];//a充當(dāng)左值,它的類型是數(shù)組類型:chart習(xí)[2]sticpv((chai*)a,"01234");printf(M%dsizeof(a[0]));printf(”%s\iT,(chai*)(a[0]+1));//1234(char*)(a+1));//234char*p=(chai*)malloc(10);sticpv(p,”012345678”);printf(M%s\ii,\(cliar*)((typeof(&a))p+1));//678fiee(p);}//=======—========staticvoidtest!1()chai-s[2]=”ab”;chaia[3][2]={”ab“,e,(C,d),{*g\*h*}};//chara[3][2]={{”ab“},{?,fc\*d*)},{g,IT}};pnntf(M%c\n,\a[0][l]);pmitfC%c\n",a[0][2]);pnntf(M%c\ir\a[l][l]);pnntf(M%c\n,\a[2][l]);}2、簡述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)存儲區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時指向任意類型的內(nèi)存塊。修改內(nèi)容上的差別chara[]=“hello”;a[0]='X,;char*p=“world”;//注意p指向常量字符串p[0]='X';〃編譯器不能發(fā)現(xiàn)該錯誤,運(yùn)行時錯誤用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是一個指針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量。C/C++語言沒有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請內(nèi)存時記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時,該數(shù)組自動退化為同類型的指針。chara[]="helloworld";char*p=a;cout?sizeof(a)?endl;//12字節(jié)cout?sizeof(p)?endl;//4字節(jié)計(jì)算數(shù)組和指針的內(nèi)存容量voidFunc(cliara[100])//<==>chara[]<==>chai*a{cout?sizeof(a)?endl;//4字節(jié)而不是100字節(jié)}3、請說岀數(shù)組名的含義:數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組:例如:clwstr[10];printf(M%dn,\sizeof(su));〃輸出結(jié)果為10,str指代數(shù)據(jù)結(jié)構(gòu)char[10]o數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,而且是一個指針常量,不能作自增、自減等操作,不能被修改;charstr[10];str-H-;〃編譯出錯數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,淪為普通指針;在失去其內(nèi)涵的同時,還失去了其常量特性,可以作自增、自減等操作,可以被修改。4、寫出下面代碼片段的輸出結(jié)果:intan[]={6,7,8,9,10};iiit*ptr=arr;//*(ptr++)+=123;//*ptr+++=123;*(++pti)+=123;//prmtf(H%d%dE,*ptr,*(ptr++));pnntf(M%d%d\iT;*(ptr++),*ptr);答案:88過程:對于*(ptr++)+=123;先做加法6+123,然后++,指針指向7;對于prmtf("%d%d",*ptr,*(-H-ptr));從后往前執(zhí)行,指針先++,指向8,然后輸出8,緊接著再輸出85、定義mt**a[3][4]、則變量占有的內(nèi)存空間為: 答:此處定義的是指向指針的指針數(shù)組,對于32位系統(tǒng),指針占內(nèi)存空間4字節(jié),因此總空間為3X4X4=48。6、chara[2]⑵[3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}}};mti=0;fbi(;i<12;i++)n );在空格處填上合適的語句,順序打印出a中各元素答案:printf(H%d-\*(**a+i));7、寫出下面程序段輸出結(jié)果:mtunsignedchar*pl;unsignedlong*p2;pl=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;pnntf(M%p\ir\pl+5);pnntf(M%p\ir\p2+5);return0;}答案:0x801005(相當(dāng)于加上5位)0x810014(相當(dāng)于加上20位)8、輸出?void(**p)++;//line數(shù)組中的元素的值加1(邛)++;〃指針移動iiitintlme[10]j;int*p=line;for(i=0;i<10;i++){*P=i;g(&P);}fbi(i=0;i<10;i++)printf(”%d'\line[i]);return0;}答案:12345678910這道題目不是很好理解,我們可以把題目g函數(shù)改為voidg(int**s)(**s)++;(均++;}這樣不容易看混淆S就是一個形式參數(shù),g(&p)輸入的就是p的地址,這樣有如下指向:*p->p->line調(diào)用函數(shù)時候,**s對應(yīng)*p即數(shù)組中的數(shù),*s對應(yīng)p即數(shù)組數(shù)字的地址,這樣就可以知道了(**s)++是line中的內(nèi)容增加;(*s)++是地址增加。
9、讀程序,寫出結(jié)果iiitmta[3];]]]Wo12taaa?1I=0;]]]Wo12taaa?1I=0;1;=2;P=a;q=&a⑵;iiitc=a[q-p];printf(Mvaluec=%d\iT,C++);printf(Mvaluec=%d\iT,c);return0;}答:23P=a;q=&a[2];則a[q-p]=a[2]=2指針一次移動一個int,但計(jì)數(shù)為1,p=a:q=a+2。這題是要告訴我們指針的運(yùn)算特點(diǎn)10、西艾:X86結(jié)構(gòu)下,下面代碼輸出結(jié)呆是什么?chaistr[20]="Goodnight";int*p=(int*)str;p[0]=0x61626364;〃61=6*16+1==97=8p[l]=0x31323334;〃31=3*16+1==49=Tp[2]=0x41424344;〃41=4*16+1==65=Apnntf(”%s\n",str);//dcba4321DCBA解題:考察知識點(diǎn):mt的內(nèi)存人?。?2bit=4byte:chai的內(nèi)存人小:8bit=1byte:常用字符的ASCH碼,,a'=97;,A'=65;,0,=48;十六進(jìn)制轉(zhuǎn)換,0x61=97:人小端模式:所謂的小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低,和我們的邏輯方法一致。所謂的人端模式,是指數(shù)據(jù)的低位(就是權(quán)值較小的后面那幾位)保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中,這樣的存儲模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向人增加,而數(shù)據(jù)從高位往低位放;而X86結(jié)構(gòu)為小端模式,所以p[0]=0x61626364;//97,98,99,100對應(yīng)a,b,c,d,小端存在字符串str則為dcbap[l]=0x31323334;//同理4321p[2]=0x41424344;〃同理DCBA代碼輸出:dcba4321DCBA11、內(nèi)存訪問有以下代碼:voidfh(){inta[100];int*p;p=(int*)((unsignedmt)a+1);piintf(3=0x%x\n”,*p);}試評論以上代碼。p=(int*)((unsignedint)a+1);代碼的意圖是想使p指向數(shù)組的第二個元素,但通常的寫法是:p=a+l。這里存在這樣的問題:a是個常量地址,a+1指向下一個數(shù)組元素,而((unsignedmt)a+1)指向卞一個內(nèi)存地址。如果地址是字節(jié)計(jì)數(shù)的,則p指向的是數(shù)組第一個元素的第二個字節(jié)。還有一個效果就是:在RISC上該printf語句會出異常,因?yàn)椴辉试S非對齊訪問(nus-alignedaccess)?對齊訪問就是訪問2字節(jié)變量的地址要能被2整除,4字節(jié)變量的地址要能被4整除。12、仕蘭微面試題目A)voidtestf(mt*p){*p+=1;}iiitmaiii(void){mt*n.m[2];n=m;m[0]=1;m[l]=8;testf^n);pnntf(M%dir\*n);retuin0;E)*p+=1;}iiitmaiii(void){int*n.m[2];n=m;m[0]=1;m[l]=8;testf(&n);pmitf(?%d\d;*n);return0;}卜面的結(jié)果是程序A還是程序B的?Datavalueis8那么另一段程序的結(jié)果是什么?答案:8是E程序的結(jié)果13、要對絕對地址0x100000賦值,我們可以用*(unsignedint*)0x100000=1234;那么要是想讓程序跳轉(zhuǎn)到絕對地址是0x100000去執(zhí)行,應(yīng)該怎么做?答:((void(*)())0x100000)0;首先要將0x100000強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:(void(*)0)0x100000然后再調(diào)用它:((void(*)())0x100000)0;用typedef可以看得更直觀些:typedefvoid(*voidFuncPtr)Q;((voidFuncPti)Ox100000)();14、寫出下列代碼的輸岀內(nèi)容#iiiclude<stdio.h>typedefint(*FUNC1)(iiit);typedefint(*FUNC2)(mt*,iiit*.iiit*);iiitfbo(inta){retuin(++a);}iiitmulti(int*a,int*b,int*c){retum(*c=*a**b);Jvoidshow(FUNC2firn、mtaigl,int*arg2){FUNCIp=&foo;iiittemp=p(argl);//llhm(&temp,&argl.arg2);iiitmaiii(){iiita;show(multi,l0,&a);retuin0;}答:11015、解釋下列輸出結(jié)果charstrl[]=,,abcH;charstr2[]=Habcn;constcharstr3[]=MabcH;constcharstr4[]=MabcH;constchar*str5=Mabcn;constchar*str6=Mabcn;char*str7=HabcH;char*str8=HabcH;cout?(str!=str2)?endl;cout?(str3=str4)?endl;cout?(str5=str6)?endl;cout?(str7=strS)?endl;結(jié)果是:0011解答:strl,str2,su-3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;此時的數(shù)組名,實(shí)際上是兩個分別指向數(shù)組起始元素的指針。而str5,str6,str7,sU-8是指針,它們指向相同的常量區(qū)域。16、下面的C程序是合法的嗎?如果是,那么輸出是什么?#include<stdio.h>iiitmain(){iiita=3,b=5;//priiitf(nhello%sM,world);printf(&a「Ya!Hello!whatisthis9%s\nM],&b[,junk/superM]);//&(Hjunk/supern[bJ)pnntf(&a「WHAT%c%c%c%c%c%c!\n”],l[”this”],2rbeauty?10rtool”],0[”is73[”sensitive”],4[”CCCCCC”]);leturn0;}參考答案:本例是合法的,輸出如下:Hello!whatisthis?superThatisC!本例主要展示了一種另類的用法。卜?面的兩種用法是相同的:Hhellon[2]2[Hhellon]如果你知道:a[i]其實(shí)就是*(a+i)也就是*(i+a),所以如果寫成i[a]應(yīng)該也不難理解了。17、下面的程序運(yùn)行時哪里會出現(xiàn)錯誤:stmctS{mti;lilt*p;};iiitmain(){stmctSs;iiit*p=&s.i;p[0]=4;p[l]=3;s.p=p;s.p[l]=l;s-p[O]=2;leturn0;}【題目解析】這道題考的是對結(jié)構(gòu)體內(nèi)存使用情況的理解。在32位的操作系統(tǒng)中,int和指針類型的變量占用空間都是4個字節(jié)。在本題中&s.i的值實(shí)際就是&s的值,所以“int*p=&s.i”也就相當(dāng)于把p指向了結(jié)構(gòu)體s的地址的起始位置。如圖1所示。圖1假設(shè)&s的值為0x12300,則p的值也是0x12300,p[0]指的是從0x12300開始的連續(xù)4個字
節(jié)的空間,p[l]指的是從0x12304(注意!不是0x12301)開始的連續(xù)4個字節(jié)的空間。這樣,p[0]也就相當(dāng)于s.i,p[l]也就相當(dāng)于s.p,分析到這一步,可以確定程序運(yùn)行到“s.p=p;”這里不會出錯。繼續(xù)往卞看。在進(jìn)行了“S.p=p;”的賦值之后,s.p指向的是s的首地址,此時s.p[0]相當(dāng)于s.i,s.p[l]相當(dāng)于s.p。下一句“s.p[l]=l”執(zhí)行過之后,此時s.p的值為1,也就是指向內(nèi)存的0x1處,隱患出現(xiàn)了。在執(zhí)行“s.p[0]=2”的時候,實(shí)際上是向內(nèi)存0x1起始的連續(xù)四個字節(jié)寫入0x2,而那塊內(nèi)存不屬于這個程序,會出現(xiàn)訪問非法內(nèi)存的錯誤。18、卜?面的數(shù)據(jù)聲明都代表什么?【美國某著名計(jì)算機(jī)嵌入式公司2005年9月面試題】float(**f)[10]; //f是一個二級指針,它指向的是一個一維數(shù)組的指針,數(shù)組的元素是floatodouble*(*f)[10];//f是一個指針,它指向一個一維數(shù)組,數(shù)組元素都是double*。double(*fI10])();//f是一個數(shù)組,有10個元素,元素都是函數(shù)的指針,指向的函數(shù)是沒有參數(shù)且返回double的函數(shù)。iiit*((*f)[10]);〃和int*(*f)[10]是一樣的,f是一維數(shù)組的指針。long(*f)(mt); //f是指向函數(shù)的指針,這個指針返回值是long,所帶的參數(shù)是into〃f是一個指向函數(shù)的指針,它指向這樣一種函數(shù),該函數(shù)參數(shù)為兩個,都是mt型,返回值是一個指針,返回的這個指針指向的是另外一個函數(shù)(參數(shù)只有一個,類型是mt,且返回值類型為mt
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年滬科版九年級化學(xué)下冊階段測試試卷
- 商業(yè)環(huán)境下的學(xué)生職業(yè)規(guī)劃與心理健康
- 醫(yī)療設(shè)備中安全硬件的研發(fā)與市場前景分析
- 2025中國鐵路北京局集團(tuán)限公司招聘4982人(一)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國郵政集團(tuán)公司重慶分公司社會招聘536人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國紙業(yè)投資限公司社會招聘6人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國社會科學(xué)院美國研究所第一批專業(yè)技術(shù)人員公開招聘補(bǔ)充高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國電信湖北黃岡分公司招聘30人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國新聞社應(yīng)屆高校畢業(yè)生公開招聘補(bǔ)充高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國國際工程咨詢限公司總部社會招聘20人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025學(xué)年人教新版英語七下Unit1隨堂小測
- 2024年汽車抵押貸款提前還款合同范例3篇
- 《項(xiàng)目溝通管理培訓(xùn)》課件
- 2024版教育培訓(xùn)機(jī)構(gòu)店面轉(zhuǎn)讓及課程合作協(xié)議3篇
- GB/T 44916-2024船舶和海上技術(shù)船用超低溫閘閥設(shè)計(jì)與試驗(yàn)要求
- 《BL急性腎盂腎炎》課件
- 夢想在路上 高二上學(xué)期期中家長會
- 2024-2025學(xué)年上學(xué)期上海小學(xué)語文六年級期末模擬試卷
- 行政前臺年終總結(jié)述職報告
- 無人機(jī)制造關(guān)鍵技術(shù)-洞察分析
- 2024-2025學(xué)年二年級數(shù)學(xué)上冊期末樂考非紙筆測試題(二 )(蘇教版)
評論
0/150
提交評論