c語言變數賦值,初始化

2021-07-23 22:38:29 字數 1244 閱讀 8162

陣列變數為全域性變數,或被部分初始化,均會出現這種情況。c語言中,變數在沒有顯式初始化時,區分變數型別,有如下幾種情況:

1 全域性變數, 和靜態區域性變數,未初始化時值預設為0.無論是陣列還是變數,都是如此。

2 區域性變數,初始值為隨機值。

3 陣列類區域性變數,當被部分初始化時,未被初始化部分,值預設為0。

1.在c語言中,「初始化」和「賦值」是兩個不同的概念。樓主問題中應該是「初始化」而非「賦值」

。int a = 0; 在宣告乙個變數的時候指定變數的值,這叫做初始化;

int a; a = 2; 這叫做賦值。

2.auto變數處於執行時堆

棧。

它的特點:在呼叫乙個函式的過程中,這個函式內部的auto變數才存在,當這個函式呼叫結束時,這些變數所占用的記憶體即被收回。如果多次呼叫乙個函式,這個函式內部的auto變數在記憶體中的位址是不確定的。由於auto變數在記憶體中的位址不是一成不變的,所以在程式開始前,編譯器無法確定它們的值,並不對它們進行初始化。

因此,auto變數未被初始化時,編譯器也不知道你想要往這個變數裡存什麼,所以它的值是不確定的,毫無意義的,等著你在執行時給它進行賦值操作。

3.如果不對乙個陣列(非全域性的、非靜態的)進行初始化

,這個和上面的變數未初始化一樣,編譯

器不知道你要做什麼,所以懶得浪費時間對它們進行初始化。

如果對乙個陣列進行部分初始化,形如:

int a[10] = ;

未被初始化的部分a[3]~a[9]便會被編譯器初始化為0

。我的理解是,這是編譯器認為你只關心陣列a中前三個數的值,而後面的編譯器為了讓你省心就幫你初始化為0了,這時候編譯器想「反正你都讓我把前三個給填上了數,我也不怕麻煩了,後幾個我給你填0吧」,於是編譯器很大方地揮一揮衣袖把a[3]~a[9]填為0。

但是:int a[10];

a[0] = 1;

a[1] = 2;

a[2] = 3;

這個時候a[3]~a[9]的值並不是

0.因為這是執行時賦值,這

個時候編譯器已經下班了,所a[3]~a[9]中的值也是不確定的。 

4.最後,再說一下全域性變數和乙個函式內部的靜態區域性變數,它們並不是儲存在執行時堆疊,在程式執行過程

中,它們的在記憶體中位址是確定的,所以編譯器就把它們初始化為0。

c語言static變數初始化

程式設計師面試筆試寶典 第123頁,舉了個例子 include void fun int i intmain 書中寫道 程式輸出結果為 0 00作者原意是想表明static int value i 是變數value由於static的修飾,只會定義一次value變數,並且沒有其他對value變數賦值的...

C 初始化變數

1.初始化變數 int i1 7.2 正確,但是i1的值變為了7 int i 建議使用初始值列表 int i2 錯誤 初始值列表確保不會發生某些可能導致資訊丟失的型別轉換 int i3 錯誤 同上,且 是多餘的 2.使用auto關鍵字 struct record auto p new record ...

C語言指標的初始化和賦值

1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int p 0 除外,該語句表示指標為空 此時,p只是表示定義的是個指標變數,並沒有間接取值的意思。例如 int a 25 int ptr a int b 10 int point b i...