C語言中文網 目錄

C語言一維數組的定義

數組包含給定類型的一些對象,并將這些對象依次存儲在連續的內存空間中。每個獨立的對象被稱為數組的元素(element)元素的類型可以是任何對象類型,但函數類型或不完整類型不能作為數組元素。

數組本身也是一個對象,其類型由它的元素類型延伸而來。更具體地說,數組的類型由元素的類型和數量所決定

如果一個數組的元素是 T 類型,那么該數組就稱為“T 數組”。例如,如果元素類型為 int,那么該數組的類型就是“int 數組”。然而,int 數組類型是不完整的類型,除非指定了數組元素的數量。如果一個 int 數組有 16 個元素,那么它就是一個完整的對象類型,即“16 個 int 元素數組”。

數組的定義決定了數組名稱、元素類型以及元素個數。沒有顯式初始化操作的數組定義,其語法如下:

類型 名稱[元素數量];


元素數量在方括號([])之間,它必須是大于 0 的整數表達式。示例:
char buffer[4*512];

這一行代碼定義了一個名為 buffer 的數組,它包含 2048 個 char 類型元素。

可以利用 sizeof 運算符獲取對象所占內存空間的大小。數組在內存中的空間大小總是等于一個元素的空間大小乘以數組中元素的個數。因此,上述例子中的 buffer 數組,表達式 sizeof(buffer)會產生 2048*sizeof(char)的值。換句話說,buffer 數組占用 2048 個內存字節,因為 sizeof(char)等于 1。

在數組定義中,可以將元素數量指定為一個常量表達式,或者在特定情況下,指定為涉及變量的表達式。采用這兩種方式定義的數組分別被稱為固定長度數組(fixed-length)長度可變(variable-length)數組

固定長度數組

固定長度數組可以具有任意存儲類別:可以將它們定義在所有函數的外面或語句塊的里面,并且可以使用或不使用存儲類修飾符 static。唯一的限制是數組不能作為函數參數。一個傳入函數的數組參數需要被轉換為指向數組第一個元素的指針。

下面 4 種數組定義方式都是合法的:
int a[10];                      // a有外部鏈接
static int b[10];               // b有靜態存儲周期和文件作用域
void func()
{
  static int c[10];             // c有靜態存儲周期和塊作用域
  int d[10];            // d有動態存儲周期
  /* ... */
}

長度可變數組

如果一個數組具有動態存儲周期(也就是說,如果在語句塊內定義數組,并且沒有 static 修飾符),那么 C99 也允許把非常量表達式作為元素數量來定義該數組。這樣的數組被稱為長度可變數組(variable-length array)。

而且,長度可變數組的名稱必須是普通的標識符。長度可變數組不能作為結構或聯合的成員。在下面的示例中,只有 vla 數組的定義是合法的:
void func( int n )
{
  int vla[2*n];                 // 合法:存儲周期為動態的
  static int e[n];              // 非法:長度可變數組不可有靜態存儲周期
  struct S { int f[n]; };       // 非法:f不是一個普通標識符
  /* ... */
}

與其他動態變量一樣,每次程序流進入包含長度可變數組定義的語句塊時,都會重新創建這個長度可變數組。因此,在每次實例化時,數組都可以有不同的長度。然而,一旦被創建,即便是長度可變數組,在它的當前存儲周期內也不能改變數組長度。

動態對象被存儲在棧中,當程序流離開對象所在的語句塊時,動態對象的空間就會被釋放。因此,只有對小的、臨時的數組,定義長度可變數組才比較合理。如想動態地創建大型數組,通常應該使用標準函數 malloc()和 calloc()來顯式地分配內存空間。

這種數組的存儲周期會持續到程序結束,也可以調用函數 free()來主動地釋放被占用的內存空間。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo