劇多
首頁
資訊
體育
娛樂
汽車
投資
財經
軍事
科技
數碼
科學
遊戲
歷史
健康
政治
影視
旅遊
育兒
美食
時尚
房產
農業
社會
文化
教育
技術
美文
情感
故事
家居
職場
自然
闢謠
心理
攝影
漫畫
生活
其它
Club
Tips
熱門話題
搜尋
註冊
登入
首頁
>
Club
>
2021-02-14 10:46
陣列變數和指標的區別?
8
回覆列表
1 # 使用者32959808900
要理解多維陣列的資料型別,我們知道陣列變數和指標是等價的,那麼多維陣列實際上也是個指標,按陣列的結合規則,它其實是指向陣列元素的指標,
相當於:也就是將一個長度為20個int的陣列定義為一個新的型別,然後建立一個每個元素是這種陣列的新陣列,這個就是二維陣列。這個作為元素的子陣列一般也叫做行,那麼二維陣列是行的陣列。也可以寫出相應的指標:注意這個括號,它影響型別解析時候,變數與指標和陣列結合的順序。如果沒有這個括號,會優先結合陣列,變成指標的陣列。這類二維陣列或指標第一級解指標會得到一個數組,陣列等效於指向陣列元素的指標,第二級解指標得到陣列元素。在你的陣列元素也是指標的情況下,自然還可以做第三級解指標。你的第二行成立其實是偶然的,因為你取的地址剛好是連續的,這六個變數本身的地址分佈剛好和一個二維陣列一一對應,所以a的地址加2個int長度剛好是c。舉個例子,我們看看這個表示式:pr的型別是指標的二維陣列,相當於指向行的指標,指向的型別是int *[20]。那麼*(pr+1)的型別就是int *[20],偏移了1,實際指向了pr[1],它與&pr[1][0]相同。由於指向的仍然是個陣列,仍然可以當作指標來進行操作,所以再次取指標操作,實際上取了陣列的第一個元素,也就是說這二者是等效的。pr[1][0]在你的程式裡是&d,碰巧你的d、e、f的地址是連續的,d往後偏移一個int就是e,往後偏移兩個int是f,把&d當作一個數組來處理的話,(&d)[2]也就是*(&d + 2),剛好就是f。注意雖然我們前面說陣列在大多數時候相當於指標,能通用的情況很多,但陣列型別和指標型別還是有一些區別的,比如說sizeof()操作的結果,一個是陣列長度 * 元素大小,另一個是指標的大小;比如說構成陣列的時候,陣列的陣列(也就是二維陣列)每個元素的大小是整個陣列的大小,而指標的陣列每個元素是個指標。在取指標操作上兩者幾乎沒有區別。
發表回復
∧
中秋節和大豐收的關聯?
∨
“消逝”與“消失”有什麼區別嗎?
熱門排行
四象問卜單人試煉怎麼跳過?
兒童游泳池充氣還是不充氣的好?
水瓶座的幸運水果是什麼?
5月傍晚西邊最亮的星?
愛瑪蛋蛋2023價格?
紅油冒菜熱量?
查粉籍要查什麼?
七週年寶庫高級幣可以用新號弄嗎?
情人說感冒好些了怎麼回復他?
酒吧燈帶怎麼接長?
要理解多維陣列的資料型別,我們知道陣列變數和指標是等價的,那麼多維陣列實際上也是個指標,按陣列的結合規則,它其實是指向陣列元素的指標,
相當於:也就是將一個長度為20個int的陣列定義為一個新的型別,然後建立一個每個元素是這種陣列的新陣列,這個就是二維陣列。這個作為元素的子陣列一般也叫做行,那麼二維陣列是行的陣列。也可以寫出相應的指標:注意這個括號,它影響型別解析時候,變數與指標和陣列結合的順序。如果沒有這個括號,會優先結合陣列,變成指標的陣列。這類二維陣列或指標第一級解指標會得到一個數組,陣列等效於指向陣列元素的指標,第二級解指標得到陣列元素。在你的陣列元素也是指標的情況下,自然還可以做第三級解指標。你的第二行成立其實是偶然的,因為你取的地址剛好是連續的,這六個變數本身的地址分佈剛好和一個二維陣列一一對應,所以a的地址加2個int長度剛好是c。舉個例子,我們看看這個表示式:pr的型別是指標的二維陣列,相當於指向行的指標,指向的型別是int *[20]。那麼*(pr+1)的型別就是int *[20],偏移了1,實際指向了pr[1],它與&pr[1][0]相同。由於指向的仍然是個陣列,仍然可以當作指標來進行操作,所以再次取指標操作,實際上取了陣列的第一個元素,也就是說這二者是等效的。pr[1][0]在你的程式裡是&d,碰巧你的d、e、f的地址是連續的,d往後偏移一個int就是e,往後偏移兩個int是f,把&d當作一個數組來處理的話,(&d)[2]也就是*(&d + 2),剛好就是f。注意雖然我們前面說陣列在大多數時候相當於指標,能通用的情況很多,但陣列型別和指標型別還是有一些區別的,比如說sizeof()操作的結果,一個是陣列長度 * 元素大小,另一個是指標的大小;比如說構成陣列的時候,陣列的陣列(也就是二維陣列)每個元素的大小是整個陣列的大小,而指標的陣列每個元素是個指標。在取指標操作上兩者幾乎沒有區別。