Crack C語言之 指標之六

2021-09-30 07:17:55 字數 1109 閱讀 9838

再一次吃驚--陣列的陣列與多維陣列的區別

看見這個題目,也許有些人就會嘀咕了:難道兩者不是一樣的嗎?c語言的多維陣列不就是陣列的陣列嗎?不!兩者是有區別的,而且還不小呢。首先看看兩者的共同點:

1。記憶體映象一樣。

2。陣列引用方式一樣,都是「陣列名[下標][下標]........」。

3。陣列名都是陣列的首位址,都是乙個符號位址常量、乙個右值。

由於兩者的共同點主要反映在外部表現形式上,因此,從外部看來,陣列的陣列跟多維陣列似乎是一樣的,這造成了c程式設計師對兩者的區別長期以來模糊不清。但實際上,c語言限於本身的語言特性,實現的並非真正的多維陣列,而是陣列的陣列。

陣列的陣列與多維陣列的主要區別,就在於陣列的陣列各維之間的內在關係是一種鮮明的層級關係。上一維把下一維看作下一級陣列,也就是陣列巢狀。陣列引用時需要層層解析,直到最後一維。舉個例,對於陣列:

int a[7][8][9];

如果要訪問元素a[4][5][6],首先就要計算第一維元素4的位址,也就是a+4,由於是陣列的陣列,元素4的值代表了乙個陣列,因此元素4的值就是它所代表的那個陣列的首位址,我們用乙個符號address1代表它,也就是address1=*(a+4),接著計算第二維,顯然元素5的位址是address1+5,其值也是乙個陣列的首位址,用address2表示它,就是address2=*(address1+5),最後一維,由於已經到達了具體的元素,因此這個元素的位址是address2+6,其值*(address2+6)是乙個整數,把address1和address2分別代入相應表示式,就成了:

*(*(*(a+4)+5)+6);

這就是我們熟知的運算子的等價表示式。

而真正的多維陣列並沒有這麼多「束縛」,相比之下簡單得多,由於各維之間不是這種複雜的層級關係,元素a[4][5][6]的偏移量可以這樣直接獲得:(4*8*9+5*9+6)*sizeof(int),再加上陣列的首位址a就是元素a[4][5][6]的位址了。但是,c語言的陣列能夠這樣用首位址加上(4*8*9+5*9+6)*sizeof(int)的形式來訪問元素嗎?顯然是不行的。歸根到底就在於c語言的位址資料型別不但有型別,還具有級別。就是這種層級關係造成了c語言只能用陣列的陣列當作多維陣列。如果c語言非得要實現真正的多維陣列,那麼位址與指標的概念就得重新改寫了。

摘自再再論指標

Crack C語言之 指標之二

c 語言嵌入式系統程式設計修煉之記憶體操作 資料指標 在嵌入式系統的程式設計中,常常要求在特定的記憶體單元讀寫內容,彙編有對應的 mov指 令,而除 c c 以外的其它程式語言基本沒有直接訪問絕對位址的能力。在嵌入式系統的 實際除錯中,多借助 c語言指標所具有的對絕對位址單元內容的讀寫能力。以指標直...

C語言之指標

指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...

C語言之指標

指標的概念 什麼是指標?如果用一句話概括的的話那就是,乙個存放記憶體空間位址的變數。指標也是乙個變數,指標存放的內容是乙個位址,該位址指向乙個記憶體空間。指標變數的定義 int p 該變數用來存放乙個空間的位址。p 代表該指標指所指向記憶體空間中的值,切記指標只能存放有效的記憶體空間位址,不能存放其...