博客專欄

        EEPW首頁 > 博客 > 深入剖析一道有意思的面試題

        深入剖析一道有意思的面試題

        發布人:魚鷹談單片機 時間:2021-06-03 來源:工程師 發布文章

        魚鷹在技術交流群看到這樣一道面試題:

        1.png

        請問這道題的result值是什么(32 位機器)?

        變換一下,結果又是什么?

        2.png

        在看魚鷹剖析之前,建議認真思考之后再看下面的答案。

        1、答案是4

        2、答案不確定,結果可能是隨機的(為什么用可能)。

        3.png

        首先分析上面這道題,從里到外一步步分析:

        &arr

        取數組的首地址,并且得到的對象還是數組,可理解為對象 int(*p)[5];

        &arr + 1

        因為目前的操作對象還是數組形式,所以 + 1 時,實際上操作單位大小是數組,也就是 4* 5,也就是說此時地址指向了數組的末尾。

        4.png

        因為只申請了 5 個 int空間,所以這個空間之外的值是不知道的,但幸好這里又使用了強制轉化,將數組對象轉化了成了 int* 指針。

        這樣一來,操作對象就不再是數組,而是 int*指針。

        這樣我們就可以按照 int的大小移動指針,這里是 2 ,所以按照 int大小移動,就在 4 的位置。

        5.png

        最后取這個地址的值,這就是為什么這道題的答案是 4。

        其實如果要增加難度,可以這樣:

        6.png

        強制轉化為 char *, 并且修改移動大小 8,此時答案還是 4。

        7.png

        如果不修改移動大小,還是 2 ,那么值就是 0 。但是對于數組的初始值大于兩個字節的情況(目前的初始值很小),此時你必須提供機器的大小端情況,否則你將受到面試者的鄙視(出題不嚴謹)。

        所以這道題不是閑著慌,很考驗面試者對指針的理解。并且綜合考察了以下幾個方面:

        1、各種優先級

        2、強制轉化

        3、地址的操作對象問題。

        4、數組的分布問題。

        對象這個詞可能更多體現在面向對象語言的書籍中,事實上,C 語言中也處處蘊含該思想,只是它更多的是內存對象,比如下面這種:

        8.png

        雖然都是自加操作,但因為內存對象不同,自加的值也不同。同理,自減也一樣。

        言歸正傳,下面這個又該如何分析呢?

        9.png

        實際上,理解了上面的分析過程,這道題也能分析,只不過麻煩的是這道題的指向不在數組內,而在數組之外(arr- 20),導致取得值并不確定。

        10.png

        其實魚鷹在測試該問題時,發現優化級別3和 優化級別0 的結果是完全不同的,可能編譯器在優化時發現了代碼的傻逼,直接給了一個比較固定的值,即數組的末尾地址(注意結果就是給了一個地址,而不是取它的值,感興趣的可以自己使用 MDK 測試一下)。

        不管你是修改上面的 1 還是 2,都是固定不變的。

        但優化級別0就是你理解的結果。

        從中也可以明白級別優化的影響了,所以如果結果和自己想不一樣,不如先把優化級別設置為最低再測試。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 算法

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 舟山市| 平和县| 陵水| 上高县| 哈密市| 从化市| 金秀| 商都县| 正定县| 延寿县| 崇义县| 济阳县| 旺苍县| 义马市| 陆良县| 江口县| 油尖旺区| 读书| 正安县| 奉节县| 洛阳市| 东平县| 磐石市| 定结县| 扶沟县| 铁力市| 黄陵县| 通许县| 玉门市| 曲阜市| 台南市| 章丘市| 靖边县| 清水河县| 德江县| 中西区| 武邑县| 祁东县| 惠来县| 陵水| 肃北|