版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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的改變不會(huì)影響到b的改變,*p實(shí)際上就是a,所以執(zhí)行fl后,a=b=5這道題考查的知識(shí)范圉很廣,包括函數(shù)指針,指針數(shù)組void(*p[2])(iiit*,mt);定義了一個(gè)函數(shù)指針的數(shù)組p.p有兩個(gè)指針元素.元素是函數(shù)的指針,函數(shù)指針指向的函數(shù)是一個(gè)帶2個(gè)參數(shù),不返回任何類型值的函數(shù),所帶的兩個(gè)參數(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ì)人家都沒(méi)有什么疑問(wèn);//(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)右值時(shí)自動(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、簡(jiǎn)述數(shù)組與指針的區(qū)別?數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任意類型的內(nèi)存塊。修改內(nèi)容上的差別chara[]=“hello”;a[0]='X,;char*p=“world”;//注意p指向常量字符串p[0]='X';〃編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是一個(gè)指針變量的字節(jié)數(shù),而不是p所指的內(nèi)存容量。C/C++語(yǔ)言沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請(qǐng)內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類型的指針。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、請(qǐng)說(shuō)岀數(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í)體的指針,而且是一個(gè)指針常量,不能作自增、自減等操作,不能被修改;charstr[10];str-H-;〃編譯出錯(cuò)數(shù)組名作為函數(shù)形參時(shí),在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,淪為普通指針;在失去其內(nèi)涵的同時(shí),還失去了其常量特性,可以作自增、自減等操作,可以被修改。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過(guò)程:對(duì)于*(ptr++)+=123;先做加法6+123,然后++,指針指向7;對(duì)于prmtf("%d%d",*ptr,*(-H-ptr));從后往前執(zhí)行,指針先++,指向8,然后輸出8,緊接著再輸出85、定義mt**a[3][4]、則變量占有的內(nèi)存空間為: 答:此處定義的是指向指針的指針數(shù)組,對(duì)于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 );在空格處填上合適的語(yǔ)句,順序打印出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(邛)++;〃指針移動(dòng)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就是一個(gè)形式參數(shù),g(&p)輸入的就是p的地址,這樣有如下指向:*p->p->line調(diào)用函數(shù)時(shí)候,**s對(duì)應(yīng)*p即數(shù)組中的數(shù),*s對(duì)應(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指針一次移動(dòng)一個(gè)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解題:考察知識(shí)點(diǎn):mt的內(nèi)存人小:32bit=4byte:chai的內(nèi)存人?。?bit=1byte:常用字符的ASCH碼,,a'=97;,A'=65;,0,=48;十六進(jìn)制轉(zhuǎn)換,0x61=97:人小端模式:所謂的小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中,這種存儲(chǔ)模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來(lái),高地址部分權(quán)值高,低地址部分權(quán)值低,和我們的邏輯方法一致。所謂的人端模式,是指數(shù)據(jù)的低位(就是權(quán)值較小的后面那幾位)保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中,這樣的存儲(chǔ)模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向人增加,而數(shù)據(jù)從高位往低位放;而X86結(jié)構(gòu)為小端模式,所以p[0]=0x61626364;//97,98,99,100對(duì)應(yīng)a,b,c,d,小端存在字符串str則為dcbap[l]=0x31323334;//同理4321p[2]=0x41424344;〃同理DCBA代碼輸出:dcba4321DCBA11、內(nèi)存訪問(wèn)有以下代碼:voidfh(){inta[100];int*p;p=(int*)((unsignedmt)a+1);piintf(3=0x%x\n”,*p);}試評(píng)論以上代碼。p=(int*)((unsignedint)a+1);代碼的意圖是想使p指向數(shù)組的第二個(gè)元素,但通常的寫法是:p=a+l。這里存在這樣的問(wèn)題:a是個(gè)常量地址,a+1指向下一個(gè)數(shù)組元素,而((unsignedmt)a+1)指向卞一個(gè)內(nèi)存地址。如果地址是字節(jié)計(jì)數(shù)的,則p指向的是數(shù)組第一個(gè)元素的第二個(gè)字節(jié)。還有一個(gè)效果就是:在RISC上該printf語(yǔ)句會(huì)出異常,因?yàn)椴辉试S非對(duì)齊訪問(wèn)(nus-alignedaccess)?對(duì)齊訪問(wèn)就是訪問(wèn)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、要對(duì)絕對(duì)地址0x100000賦值,我們可以用*(unsignedint*)0x100000=1234;那么要是想讓程序跳轉(zhuǎn)到絕對(duì)地址是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í)際上是兩個(gè)分別指向數(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)行時(shí)哪里會(huì)出現(xiàn)錯(cuò)誤: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;}【題目解析】這道題考的是對(duì)結(jié)構(gòu)體內(nèi)存使用情況的理解。在32位的操作系統(tǒng)中,int和指針類型的變量占用空間都是4個(gè)字節(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開(kāi)始的連續(xù)4個(gè)字
節(jié)的空間,p[l]指的是從0x12304(注意!不是0x12301)開(kāi)始的連續(xù)4個(gè)字節(jié)的空間。這樣,p[0]也就相當(dāng)于s.i,p[l]也就相當(dāng)于s.p,分析到這一步,可以確定程序運(yùn)行到“s.p=p;”這里不會(huì)出錯(cuò)。繼續(xù)往卞看。在進(jìn)行了“S.p=p;”的賦值之后,s.p指向的是s的首地址,此時(shí)s.p[0]相當(dāng)于s.i,s.p[l]相當(dāng)于s.p。下一句“s.p[l]=l”執(zhí)行過(guò)之后,此時(shí)s.p的值為1,也就是指向內(nèi)存的0x1處,隱患出現(xiàn)了。在執(zhí)行“s.p[0]=2”的時(shí)候,實(shí)際上是向內(nèi)存0x1起始的連續(xù)四個(gè)字節(jié)寫入0x2,而那塊內(nèi)存不屬于這個(gè)程序,會(huì)出現(xiàn)訪問(wèn)非法內(nèi)存的錯(cuò)誤。18、卜?面的數(shù)據(jù)聲明都代表什么?【美國(guó)某著名計(jì)算機(jī)嵌入式公司2005年9月面試題】float(**f)[10]; //f是一個(gè)二級(jí)指針,它指向的是一個(gè)一維數(shù)組的指針,數(shù)組的元素是floatodouble*(*f)[10];//f是一個(gè)指針,它指向一個(gè)一維數(shù)組,數(shù)組元素都是double*。double(*fI10])();//f是一個(gè)數(shù)組,有10個(gè)元素,元素都是函數(shù)的指針,指向的函數(shù)是沒(méi)有參數(shù)且返回double的函數(shù)。iiit*((*f)[10]);〃和int*(*f)[10]是一樣的,f是一維數(shù)組的指針。long(*f)(mt); //f是指向函數(shù)的指針,這個(gè)指針?lè)祷刂凳莑ong,所帶的參數(shù)是into〃f是一個(gè)指向函數(shù)的指針,它指向這樣一種函數(shù),該函數(shù)參數(shù)為兩個(gè),都是mt型,返回值是一個(gè)指針,返回的這個(gè)指針指向的是另外一個(gè)函數(shù)(參數(shù)只有一個(gè),類型是mt,且返回值類型為mt
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年秋季六年級(jí)班主任工作計(jì)劃范文(34篇)
- 分包采購(gòu)合同框架協(xié)議(2篇)
- Unit2into the Future(詞匯短語(yǔ)句式)-2025屆高三人教版英語(yǔ)一輪復(fù)習(xí)闖關(guān)攻略(解析版)
- 通關(guān)03 世界史選擇題專練(解析版)
- 第2單元 第二次工業(yè)革命和近代科學(xué)文化(A卷·知識(shí)通關(guān)練)(解析版)
- 2024年度天津市公共營(yíng)養(yǎng)師之三級(jí)營(yíng)養(yǎng)師考前沖刺試卷B卷含答案
- 2025裝修工程施工承包合同
- 2025年中國(guó)萍蓬草子行業(yè)市場(chǎng)全景評(píng)估及投資策略咨詢報(bào)告
- 貿(mào)易組織研究院020255世界經(jīng)濟(jì)報(bào)錄數(shù)據(jù)分析報(bào)告初試+
- 2025年中國(guó)風(fēng)衣市場(chǎng)發(fā)展前景預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 安全生產(chǎn)費(fèi)用歸集清單(安措費(fèi)清單)
- 左傳簡(jiǎn)介完整
- 榕江縣銻礦 礦業(yè)權(quán)出讓收益計(jì)算書
- 顱腦外科手術(shù)環(huán)境及手術(shù)配合
- 長(zhǎng)期異地安置、居住就醫(yī)備案承諾書【模板】
- 盤查戰(zhàn)術(shù)教案
- GB/T 2652-2022金屬材料焊縫破壞性試驗(yàn)熔化焊接頭焊縫金屬縱向拉伸試驗(yàn)
- GB/T 1243-1997短節(jié)距傳動(dòng)用精密滾子鏈和鏈輪
- 打起手鼓唱起歌二聲部改編簡(jiǎn)譜
- 陜西西安電子科技大學(xué)招考聘用(同步測(cè)試)模擬卷和答案
- 父母教養(yǎng)方式與青少年學(xué)業(yè)自我效能的關(guān)系:自尊和學(xué)業(yè)自我概念的中介作用優(yōu)秀獲獎(jiǎng)科研論文
評(píng)論
0/150
提交評(píng)論