日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

经典C++面试题

發布時間:2024/4/11 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典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,所以sizeofC++中其實是一個關鍵字。

?

?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);


  char *strcpy(char *strDest,const char *strSrc){assert(strDest != NULL && strSrc != NULL);char *address = strDest;while((*strDest++ = *strSrc++) != '\0');return address; }

為什么還要返回一個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為指向函數的指針。





總結

以上是生活随笔為你收集整理的经典C++面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。