Re: [問題] 二維陣列指標表示方法

看板C_and_CPP作者 (consteval)時間2年前 (2022/02/04 22:03), 2年前編輯推噓1(102)
留言3則, 3人參與, 2年前最新討論串2/2 (看更多)
※ 引述 《lllll12b56》 之銘言: : 例如我宣告a[5][5]這個二維陣列 : : 為什麼a+2的值跟*(a+2)的值都是位置 : : 還是同樣的位置? 同位址不同type https://godbolt.org/z/boP9s6ovG : 我原本還以為*(a+2) = a[2][0] : : 結果自己試才知道要取a[2][0]要**(a+2) 下圖STDIN是foo.cpp的Clang AST dump(C++模式parse出來的): https://i.imgur.com/7f88QAS.png
a是一個array of 8 arrays of 7 ints a + 2: 對應AST第6-9行。 a的type先由int[8][7] decay成int (*)[7],也就是a pointer to an array of 7 ints(A ST第七行),而且根據[conv.array]指到a[0],也就是第一個array of 7 ints。之後進行p ointer arithmetic(AST第六行),加2就是跳過整整兩列(兩個int[7])。 *(a + 2): 對應AST第10-15行,其中第12-15行就是上一個case。 第10行對int(*)[7](pointer to an array of 7 ints)dereference得到int[7](an array of 7 ints),如果是C還會再decay到int*。a有8個int[7],此expression得到的是a[2]這一個。 **(a + 2): 對應AST第16-23行,其中第18-23行為上一個case。 第17行int[7]先decay到int*,再來才第16行dereference int*得到int。a[2]有8個int,此 expr得到的是a[2][0]。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.146.111 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1643983404.A.B52.html

02/04 22:06, 2年前 , 1F
※ 編輯: Dracarys (1.34.146.111 臺灣), 02/04/2022 22:42:47

02/04 22:52, 2年前 , 2F
喔喔~這麼硬核!(◎_◎;)
02/04 22:52, 2F

02/08 13:18, 2年前 , 3F
02/08 13:18, 3F
文章代碼(AID): #1X_J8ijI (C_and_CPP)
文章代碼(AID): #1X_J8ijI (C_and_CPP)