如何給陣列中的元素賦值?
如果把單個變數看成是“遊兵散勇”的話,那麼陣列對應的是“集團”。集團的“兵”就是我們前面說的陣列的元素。這些“兵”不再有單獨的名字,而是統一使用編號來區別,這個編號,我們稱為“下標”。
在和陣列打交道時,我們需要分清:是對整個陣列操作,還是對陣列中的單個元素進行操作。
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]將造成越界。
(越界可以直觀地理解為“越出邊界“,即越出陣列的邊界,訪問到了陣列以外的記憶體,其內容將是未知的。)