數組有一系列相同的元素構成。使用數組聲明來告訴編譯器需要一個數組。數值聲明包括數組元素的數目和元素的類型。
要訪問數組中的元素可以使用下標(index)來表示單個元素,index是從0開始計數的。
數組的初始化:
比如
days[12]={31,29,31,30,31,30,31,31,30,31,30,31}
如果數組沒有初始化
比如
int no_data[4]
當列印出數組元素時,數組的值是不定的。因為編譯器使用的數值是儲存單元中已有的數值。
初始化列表中的元素數目應該和數組大小一致。如果二者不一致:
1.比如當數值數目少於數組元素數目時,多餘的數組元素被初始化為0。例子如下:
1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 int some_data[SIZE]={1492,1066};
6 int i;
7 printf("%2s%14s\n","i","some_data[i]");
8 for(i=1;i<SIZE;i++)
9 printf("%2d%14d\n",i,some_data[i]);
10 return 0;
11 }
output:
i some_data[i]
1 1066
2 0
3 0
2.如果初始化列表中項目的個數大於數組大小,編譯器會認為這個一個錯誤。程式就無法運行。
可以省略括弧中的數字,從而讓編譯器自動匹配數組的大小和初始化列表中的項目數目
1 #include <stdio.h>
2 int main(void)
3 {
4 const int days[]={31,28,31,30,31,30,31,31,30,31};
5 /*const:
6 有時需要使用唯讀數組,也就是程式從數組中讀取數值,但是程式不想數組中寫入資料。在這種情況下,可以使用關鍵字const。這樣,程式會把數組中的每個元素當成常量來處理。用const聲明之後不能再對它賦值*/
7 int index;
8 /*運算子sizeof給出其後的對象或類型的大小(以byte為單位)*/
9 for(index=0;index<sizeof days/sizeof days[0];index++)
10 printf("Monsth %2d has %d days.\n",index+1,days[index]);
11 return 0;
12 }
多維陣列
多維陣列是數組的數組。比如5年中每月的降水用float rain[5][12]來表示。可以解釋為rain具有5個元素,並且每個元素都是包含12個float數值的數組。
用二維視圖表示數組可以直觀的想象兩個索引的數組。實際上,數組是順序儲存的,前12個元素之後,耕者就是第二個包含23個元素的數組。
多維陣列的初始化要注意幾個問題:
1.比如:
const float rain[5][12]={
{4.3,4.3,1.2,3.0},
{5.2,3.0,1.6,3.5},
......
}
第一個列表中只有4個數值,則第一行只有前4個元素得到賦值,最後8個元素被預設初始化為0。如果列表中的數值多於12個,則報告錯誤,程式無法運行,而且這些數值不會影響到下一行的賦值。
2.初始化的時候也可以省略內部的花括弧,只保留最外面一對花括弧。只要保證數值的個數正確,初始化效果就是一樣的。如果數值的個數不夠,那麼在數組初始化時候,按照先後順序來逐行賦值,一次前面的元素首先得到賦值,直到後面沒有賦值的元素被初始化為0.
指標和數組
數組名同時也是該數組首元素的地址
1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 short dates[SIZE];
6 short * pti;
7 short index;
8 double bills[SIZE];
9 double * ptf;
10
11 pti=dates; /*把數組的首地址賦給指標*/
12 ptf=bills;
13 printf("%23s %10s\n","short","double");
14 for(index=0;index<SIZE;index++)
15 printf("pointers + %d: %10p %10p\n",index,pti+index,ptf+index);
16 return 0;
17 }
output:
short double
pointers + 0: 0028FF0C 0028FEE8
pointers + 1: 0028FF0E 0028FEF0
pointers + 2: 0028FF10 0028FEF8
pointers + 3: 0028FF12 0028FF00
在上面的例子中,對一個指標加1的結果是對該指標增加一個儲存單元。
因為在C語言中:對一個指標加1的結果是對該指標增加一個儲存單元(也就是說:對指標加1,等價於對指標的值加上它指向的對象的位元組大小)。對數組而言,地址會增加到下一個元素的地址,而不是下一個位元組。
比如: *(days+index)和days[index]等價
//未完成