1. 程式人生 > >如何給陣列中的元素賦值?

如何給陣列中的元素賦值?

如果把單個變數看成是“遊兵散勇”的話,那麼陣列對應的是“集團”。集團的“兵”就是我們前面說的陣列的元素。這些“兵”不再有單獨的名字,而是統一使用編號來區別,這個編號,我們稱為“下標”。

在和陣列打交道時,我們需要分清:是對整個陣列操作,還是對陣列中的單個元素進行操作。

1. 在定義陣列時初始化。

普通變數可以在定義時同時賦初值:

int a = 100;

也可以在定義以後才賦值:

int a;

a = 100;

對於陣列變數,則只能在定義時,對整個陣列賦初值:

資料型別 陣列變數名[個數] = {元素1初值,元素2初值,};

即,將初值用一對 {} ( 花括號 )括起來,相鄰的值之間用逗號分隔。

比如:

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

上面定義一了個數組 arr,共10個元素。初始值為從9到0。即,執行上面程式碼以後,arr[0]值為10,arr[1]值為9……arr[9]值為0。

在初始化賦值是時,注意所給值的個數不能超過陣列的大小,比如:

int arr[10] = {10,9,8,7,6,5,4,3,2,1,0};  //錯誤!越界了

你定義了陣列為10個元素,可是你卻賦給它11個值,這稱為陣列越界:你在賓館裡預定了10間房,你卻讓11個人去住,多出的那個人擠在哪裡呢?編譯器遇上這類問題時,很明智地停了下來。

不過,你可以給它少於定義個數的初值

int arr[10] = {9,8,7,5};               //允許

你定義了陣列為10個元素,但你可以給它少於10個的初始值。那些沒有得到初始值的元素值是多少呢?對於全域性變數來說,將被編譯器初始化為0,對於區域性變數而言,則是未定義的值(不可預測的值)。如果只定義陣列,沒有對其進行任何初始化,同樣適於本情況。所有元素的初值均依本陣列是全域性或區域性變數而定,為0或未定義值。

可以跳過一兩個元素不初始化嗎?如:

int arr[10] =  {9,,7,,6};  //跳過中間的某些元素,C:OK;C++: Error

因為我們主要學習C++,所以認為跳過陣列中某些元素的初始化賦值是錯誤的

也就是說,你儘可以先預定下多個房間,然後先只派部分人去住。不過C說:允許你們跳著房號住,而C++則要求依次住下,把空房留在後面。

你還可以不指定陣列元素個數,直接通過對其初始化來讓編譯器得到它的實際個數:

int arr[] = {9,8,7};  //元素個數為: 3

即,在未指定義大小時,則初始值的個數就是陣列元素的個數

不過,你不能既不指定陣列元素個數,也不進行初始化

int arr[];   //Error, 到底是幾個元素?

這也沒有什麼不好理解的,去幾個人,就開幾個房間。讓賓館老闆自已去數人頭,我們不必非得自已報人數——前提是,房客一個一個的都得事先現身。

2 .在定義之後為元素賦值

很多時候,我們無法在定義陣列的同時就知道陣列中各元素的值,所以,這時需要在定義以後各陣列中的各個元素賦值。記住,此時只能對單個元素進行直接操作。這和普通變數不一樣,下面的程式碼是錯誤的:

int arr[5];

...

arr[5] = {1,2,3,4,5}; //錯,在編譯器看來,arr[5]是陣列arr的第6個元素。

//或

arr = {1,2,3,4,5};   //錯,仍然不行。

這一點和普通變數不一樣。也就是說,對陣列整體的初始化,只能在定義時實行。

大都數情況,我們這樣改變陣列中某個元素的值:

int arr[5];

arr[0] = 95; 

arr[1] = 89;

arr[2] = 100;

...

前面關於成績管理的例子中,已經有過如何改變陣列元素值的程式碼:cin >> cj[i]; 這一句將使用者輸入的成績賦給陣列cj中的第i個元素(i從0計起)。

兩個陣列可以相互賦值嗎?答案也是不行:

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

int arr2[5];

arr2 = arr2; //不行!整個陣列之間不能直接相互賦值。

你可能很不理解為什麼上面的程式碼會出錯,不過在學習後面有關指標及記憶體地址的更多知識以後,你會明白。現在我們只能告訴你,以我們的所學,可以方便地用一個迴圈來 實現將一個數組內的值全部賦值給另一個數組,這也稱為陣列間的拷貝。

for(int i=0;i<5;i++)

{

    arr2[i] = arr1[i]; //正確,陣列元素之間可以相互賦值。

}

當然,這樣做可一定要注意:當兩個陣列的元素個數不一致時,不要越界訪問:

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

int arr2[6];

for(int i = 0;i<6;i++)  // i 從 0 到 5

{

    arr2[i] = arr1[i];

}

arr2有6個元素,而arr1只有5個。當迴圈執行到 i為5時,訪問arr1[5]將造成越界。

(越界可以直觀地理解為“越出邊界“,即越出陣列的邊界,訪問到了陣列以外的記憶體,其內容將是未知的。)