天天看點

數組初始化 初始化靜态和自動初始化不完整的初始化自動計算數組長度字元數組初始化

 初始化

給數組指派的方法除了用指派語句對數組元素逐個指派外, 還可采用初始化指派和動态指派的方法。

數組初始化指派是指在數組定義時給數組元素賦予初值。數組初始化是在編譯階段進行的。這樣将減少運作時間,提高效率。初始化指派的一般形式為:

類型說明符 數組名[常量表達式] = { 值, 值……值 };

其中在{ }中的各資料值即為各元素的初值,各值之間用逗号間隔。例如:

int a[10]={ 0,1,2,3,4,5,6,7,8,9 };      

靜态和自動初始化

數組初始化類似标量變量初始化的方式:也就是取決于它們的存儲類型。存儲于靜态記憶體隻初始化一次,也就是在程式開始之前,程式不需要執行指令将這些值放在合适的位置,因為它們一開始就在那裡,這些是由連結器來完成的,它用可執行程式的檔案中合适的值對數組元素進行初始化,如果數組未被初始化,數組元素的初始值将會自動設定為零。當這個檔案載入到記憶體中準備執行時,初始化後的數組值和程式指令也一樣被載入到記憶體中,是以當程式執行時,靜态數組初始化已經完成。

對于自動變量而言,因為自動變量位于運作時堆棧中,執行流每次進入它們所在的代碼塊時,這類變量每次所處的存儲位置可能并不相同。在程式開始之前,編譯器沒有辦法對這些位置進行初始化,是以自動變量在預設情況下是未初始化的。若是自動變量在聲明中給出了初始值,每次當執行流進入自動變量聲明所在的區域時,變量就被一條隐式的指派語句初始化,這條隐式的指派語句和普通的指派語句一樣需要空間和時間來執行,數組的問題在于初始化清單中可能有很多的值,那麼初始化的時間将非常可觀。

因而需要考慮,當數組的初始化位于一個函數(或代碼塊)時,每次對數組進行重新初始化是否值得,若答案是否定的,就要把數組聲明成static形式,這樣數組的初始化隻需在程式開始前執行一次。

不完整的初始化

如下初始化:

int vector [5]={1,2,3,4,5,6};
int vector[5]={1,2,3};      

已上兩種情況,第一種情況的定義是錯的,沒有辦法将6個整型值裝到5個整型變量中。

但是第二種情況是合法的,它為數組的前三個值提供初始化,最後兩個元素初始化為0。

自動計算數組長度

初始化:

int vector[]={1,2,3,4,5};      

聲明中如果未給出數組長度,編譯器就把數組長度設定為剛好能夠容納所有的初始值的長度。

字元數組初始化

笨拙的方法: 

char  message []={'H','e','l','l','o'};      

 快速的方法:

char  message []="Hello"      

盡管這看上去是一個字元串常量,實際上并不是,它隻是前面一個例子中的另一種寫法,當用于初始化一個字元數組時,它就是一個初始化清單,在其它任何地方,它表示一個字元串常量:

如下:

char  message[]="Hello";
char *message2="Hello";      

這兩個初始化看上去很像,但是它們含義不同,前者初始化一個字元數組的元素,而後者是一個真正的字元串常量,這個指針變量被初始化為指向這個字元串常量的存儲位置,如下圖:

數組初始化 初始化靜态和自動初始化不完整的初始化自動計算數組長度字元數組初始化

轉載于:https://www.cnblogs.com/xiaojianliu/articles/8722080.html