博客專欄

        EEPW首頁 > 博客 > C/C++二維數組名和二級指針

        C/C++二維數組名和二級指針

        發布人:電子禪石 時間:2023-01-10 來源:工程師 發布文章

        1. 指針

        1.1 一個指針包含兩方面:a) 地址值;b) 所指向的數據類型。


        1.2 解引用操作符(dereference operator)會根據指針當前的地址值,以及所指向的數據類型,訪問一塊連續的內存空間(大小由指針所指向的數據類型決定),將這塊空間的內容轉換成相應的數據類型,并返回左值。

        有時候,兩個指針的值相同,但數據類型不同,解引用取到的值也是不同的,例如,


        char str[] ={0, 1, 2, 3};       /* 以字符的ASCII碼初始化 */

         

        char * pc = &str[0]; /* pc指向str[0],即0 */

         

        int * pi = (int *) pc; /* 指針的“值”是個地址,32位。 */

        此時,pc和pi同時指向str[0],但*pc的值為0(即,ASCII碼值為0的字符);而*pi的值為50462976。或許把它寫成十六進制會更容易理解:0x03020100(4個字節分別為3,2,1,0)。我想你已經明白了,指針pi指向的類型為int,因此在解引用時,需要訪問4個字節的連續空間,并將其轉換為int返回。



        2. 數組

        2.1 數組名和指針


        通常我們認為數組名是一個指針常量(例如,int a[10]; 那么a是一個int * const),這種理解是不全面的,正確的理解如下:


        作為右值(例如,賦值語句右邊)時數組名可視為指針常量(系統自動轉換);作為左值,例如取地址,sizeof,則不能視為指針。


        sizeof(一個數組)返回的是數組大小*每個元素占字節數;而sizeof(一個指針)返回4。


        2.2 二維數組


        實際上,不管是一維還是多維數組,都是內存中一塊線性連續空間,因此在內存級別上,其實都只是一維。





        (圖片在參考資料2基礎上稍作更改)



        做如下定義:


        int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

        int ** p;

         

        p = (int**)a; /* 不做強制類型轉換會報錯 */

        說明:


        1)p是一個二級指針,它首先是一個指針,指向一個int*;

        2)a是二維數組名,它首先是一個指針,指向一個含有4個元素的int數組;


        由此可見,a和p的類型并不相同,如果想將a賦值給p,需要強制類型轉換。


        3. 為什么不能將二維數組名傳遞給二級指針?

        假如我們將a賦值給p,p = (int**)a; 既然p是二級指針,那么當然可以這么用:**p; 這樣會出什么問題呢?


        1)首先看一下p的值,p指向a[0][0],即p的值為a[0][0]的地址;


        2)再看一下*p的值,p所指向的類型是int*,占4字節,根據前面所講的解引用操作符的過程:從p指向的地址開始,取連續4個字節的內容。得到的正式a[0][0]的值,即0。


        3)再看一下**p的值,誒,報錯了?當然報錯了,因為你訪問了地址為0的空間,而這個空間你是沒有權限訪問的。



        實際上這是某一年華為的面試題。感興趣的還可以把a的類型定義為char類型的二維數組,看看會發生什么。



        4. 二維數組和二級指針相關的參數匹配


        (來源參考資料3)

        5. 那么問題來了,下題答案是?


        參考資料:


        1. http://blog.sina.com.cn/s/blog_5c6f793801019t3t.html

        2. http://c.biancheng.net/cpp/html/477.html

        3. http://www.360doc.com/content/12/0421/23/8302596_205542017.


        -----------------------------------------------------------------------------



        以上,不知道我有沒有說清楚,有問題歡迎評論留言。

        ————————————————

        版權聲明:本文為CSDN博主「吳一奇」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

        原文鏈接:https://blog.csdn.net/wu_nan_nan/article/details/51741030


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



        關鍵詞: c

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 丹江口市| 体育| 安阳县| 高密市| 普兰县| 临沧市| 岑巩县| 碌曲县| 务川| 和平县| 建瓯市| 滁州市| 马边| 赤壁市| 阿拉善右旗| 都昌县| 昌江| 太和县| 米易县| 平定县| 樟树市| 伊金霍洛旗| 香港 | 荣成市| 马山县| 邮箱| 鹤岗市| 定陶县| 清新县| 鹤庆县| 庄河市| 白山市| 佛山市| 丹巴县| 拉萨市| 宾阳县| 太湖县| 阳原县| 彰化县| 湘阴县| 上犹县|