经典C++面试题
1.關于++a與a++
?
???int?a?=?5;?那么++(a++)的值是多少?
?????????
???說到這道題,我們先來研究++a與a++的區別,編譯器對++a的調用,相當于int?operator++?(int),可以看
? ?出,返回的依然是int類型,所以無論在a的左邊無論有多少個++都是可以的。而對于a++則不同,在編譯器中,
? ?相當于調用const?int?operator++?(),這里的const是一個常量,所以只能作為右值,不能再進行++,所
???以a++++就不合法了。另外++a執行后的結果還是保存在a中,即相當于a?=?++a,而對于a++,執行后的結果是
? ?保存在一個臨時變量中,這個臨時變量是一個const右值,用后很快就會消失的。所以,上面的++(a++)編譯會
? ?出錯。
?
???那么,經過上面的分析,我們來看下面這個題就容易多了。
???int?a?=?3;
???int?b?=?(++a)?+?(++a);
???int?c?=?(a++)?+?(a++);
???求b和c的值。
?
???對于b來說,我們先看++a,它相當于a?=?++a,執行完畢后,還有一個++a,所以得到a?=?5,最終就
? ?是b?=?a?+?a?=?10
?
???對于c來說,由于a++是先使用再++,即c?=?a?+?a?=?6,而a++的結果是一個臨時變量,后來就很快消失了,
? ?根本沒有用到。
?
2.指針
?
???求下面的代碼輸出結果
???int?a[5]?=?{1,2,3,4,5};
???int?*p?=?(int?*)(&a?+?1);
???printf("%d?%d\n",*(a+1),*(p-1));
?
???注意看清楚,這里是(&a?+?1),而不是(a?+?1),&a是指向數組的指針,是一個行指針,那么實際
? ?上(&a?+?1)越界了,我們的p-1恰好是數組的最后一個元素,所以應該輸出2?5。實際上一維數組可以看成是特
? ?殊的二維數組,即a[1][5],那么上面的代碼與如下代碼是等價的:
???int?a[1][5]?=?{1,2,3,4,5};
???int?*p?=?(int?*)(&a?+?1);
???printf("%d?%d\n",*(a[0]+1),*(p-1));
?
3.char?s[]與char?*s
?
????char?s1[]?=?"abc";
????char?s2[]?=?"abc";
????char?*s3?=?"abc";
????char?*s4?=?"abc";
????cout<<(s1?==?s2)<<endl;
? ? cout<<(s3?==?s4)<<endl;
上面的代碼會輸出什么結果?
?
這就要來弄清楚char?s[]與char?*s的區別。對于char?s[]來說,它是每次都會開辟一段內存空間來存儲后面的
字符串內容,有自己的存儲空間,無論字符串內容是否一樣。而對于char??*s來說,是字符指針,不分配存儲空
間,而后面的字符串內容存儲于靜態存儲區,那么對應的所有s指針都指向這個常量字符串,所以應該輸出0?1。
?
4.關于sizeof
????
sizeof不是函數,盡管它是這樣sizeof(str),或許你不知道,它其實還可以這樣sizeof?str,所以sizeof在C++中其實是一個關鍵字。
?
?char?s1[]?=?"abcdefg";
?????char?*s2?=?"abcdefg";
?char?s3[105]?=?"abcdefg";
?cout<<sizeof(s1)<<endl;
?cout<<sizeof(s2)<<endl;
?cout<<sizeof(s3)<<endl;
?
輸出結果依次為8?4?105
首先對于s1它是數組名字,對于s1[]?,它在內存中開辟了空間,所以sizeof?s1代表整個數組的長度,注意數組
末尾還有一個’\0’,所以長度為8。而對于s2,它是一個指針,我們知道指針存儲的是地址,在C++中一個地址是
用4字節來存儲的,所以s2永遠是4。對于s3[105]來說,因為本身開辟了105字節的空間,所以輸出105。
?
5.字符串拷貝函數
?????
寫一個函數,實現字符串拷貝功能,返回函數的指針,函數原型如下:
char?*strcpy(char?*strDest,?const?char?*strSrc);
為什么還要返回一個address,目的是實現鏈式表達式。
? ??
上面的拷貝中似乎已經達到很完美了,但是它只適用內存空間不重疊的情況。如果內存空間有重疊呢,就必須分情況進行正向拷貝或者逆向拷貝。
void *memcpy(void *strDest,const void *strSrc,size_t cnt){ assert(strDest != NULL && strSrc != NULL);assert(cnt > 0);char *psrc = (char *)strSrc;char *pdest = (char *)strDest;if(pdest < psrc){while(cnt--)*pdest++ = *psrc++;}else if(psrc < pdest){psrc += cnt - 1;pdest += cnt - 1;while(cnt--)*pdest-- = *psrc--;}return strDest;}
6.常見指針
?
????int?*p[n];?????-----指針數組,每個元素均為指向整型數據的指針。
????int?(*)p[n];???-----p為指向一維數組的指針,這個一維數組有n個整型數據。
????int?*p();??????------函數返回指針,指針指向返回的值。
? ? int?(*)p();????------p為指向函數的指針。
總結
- 上一篇: HDU3939(毕达哥拉斯三元组的解)
- 下一篇: s3c2440移植MQTT