指標和定長陣列

2021-09-21 04:03:41 字數 1075 閱讀 5935

陣列就是指標這個說法並不正確,只能說陣列的名字是乙個指標,指向陣列的第乙個元素,而陣列的內容是該指標指向的記憶體後面連續的一段記憶體,這些記憶體可以用指標來定址。重要的特點是「連續的一段記憶體」,因此陣列元素就不能像鍊錶節點那樣僅僅通過乙個指標來互相聯絡,它必須保證元素是乙個挨著乙個的,既然陣列元素存在於連續記憶體,有了第乙個元素的指標和元素的大小,後面的元素也就可以自然而然的得到了,可見陣列是一種鍊錶的特化,它不依靠顯式的指標來首尾相接,而是靠「位址連續」這個特點隱式的首尾相接。

和鍊錶相比,陣列省去了next/prev欄位,從而也就節省了sizeof(type*)*n這個麼大小的記憶體空間,然而節省空間是有代價的,那就是陣列必須有乙個「外圍」的資料結構以保證其位址空間連續,或者陣列在編譯的時候確定其大小n,直接為其預留sizeof(type)*n這麼大的空間,否則無法保證同乙個陣列相鄰元素間位址連續的要求。如果編譯期間陣列的長度是動態的,那麼由於編譯器並不知道陣列的大小,只有在執行時才能確定,這樣的話為其分配多大的連續空間好呢?要知道位址空間是有限的,分配小了可能不足以滿足執行時陣列大小的最大需求,分配大了可能會浪費很多可能根本不需要的記憶體,因此陣列必須在編譯的時候確定其大小,即使它有乙個外圍資料結構,比如:

struct type1

雖然type1保證了t2的位址空間一定連續,這裡的x也一定要是確定的長度,否則type1的大小就沒有辦法確定,不管type1在棧上分配-機器隱式分配記憶體,還是在堆上分配-程式設計師顯式分配記憶體,都需要確定type1的大小。

為了位址的連續性導致了陣列必須在編譯期確定大小無疑是乙個限制,這樣的話,對於不確定大小和元素個數的資料結構,就必須使用鍊錶來顯式將元素互相連線了,如此一來即使知道在執行時分配的空間是連續的,也一定要使用乙個額外的next/prev指標相連線,這樣很不合理,因此gcc提供了在結構體後面增加乙個0長度陣列的辦法支援變長的資料結構,使得程式可以在執行的時候分配出諸如陣列一樣的連續空間的資料結構,節省了記憶體:

struct test

如果在執行時,你確定reverse的長度為n,那麼就可以如下這樣為test結構體分配記憶體:

struct test *t = (struct t*)malloc(sizeof(struct test)+n*sizeof(char));

字元指標 定長字元陣列 不定長字元陣列 字元的區別

先來點基礎知識 printf中分別代表的輸出型別 c 字元 d 有符號十進位制整數 f 浮點數 包括float和doulbe e e 浮點數指數輸出 e e 記數法 g g 浮點數不顯無意義的零 0 i 有符號十進位制整數 與 d相同 u 無符號十進位制整數 o 八進位制整數 e.g.0123 x ...

陣列指標和指標陣列

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...

陣列指標和指標陣列

一 定義 陣列指標 陣列指標 是指向陣列 首元素的位址的 指標,其本質為指標 這個指標存放的是陣列首位址的位址,相當於2級指標,這個指標不可移動 指標陣列 陣列元素為指標的陣列,其本質為陣列。二 舉例 int a 3 4 這個無需多說,就是乙個 二維陣列 int p 4 就相當於int p 4 它就...