這篇主要將的是數組的簡單概述和使用的注意事項
由於字符數組是我們常用的一種數組,所以我會單獨出一篇關於字符數組的
指針也比較重要,所以也要單純出一篇
數組概述
數組
- 構造數據類型之一
- 數組是具有一定順序關係的若干個變量的集合,組成數組的各個變量稱爲數組的元素
- 數組中各元素的數據類型要求相同,用數組名和下標確定。數組可以是一維的,也可以是多維的。
一維數組
一維數組的定義
- 所謂一維數組是指只有一個下標的數組。它在計算機的內存中是連續存儲的。
- C語言中,一維數組的說明一般形式如下:
<存儲類型> <數據類型 > <數組名>[<表達式>] - 數組名錶示內存首地址,是地址常量sizof(數組名)是數組佔用的總內存空間
- 編譯時分配連續內存內存字節數=數組維數*sizeof(元素數據類型)
int main(){
int a[6], i;
for(i = 0; i < 6; i++)
printf("%p\n", &a[i]); //%p表示指針地址,打印可見地址是連續的
printf("%p\n", &a); //數組名a即爲首地址
printf("%d\n", &sizeof(a)); //a的大小
return 0;
}
注意事項
- C語言對數組不作越界檢查,編譯時不會報錯,使用時要注意
int a[5]; a[5] = 10; //編譯不報錯,運行報錯
一維數組的引用
- 數組必須先定義,後使用
- 只能逐個引用數組元素,不能一次引用整個數組
- 數組元素表示形式:數組名[下標]
其中:下標可以是常量或整型表達式
一維數組的初始化
-
初始化方式:在定義數組時,爲數組元素賦初值
int a[5]={1,2,3,4,5}; -
說明
數組不初始化,其元素值爲隨機數
int main(){
int a[6], i;
for(i = 0; i < 6; i++)
printf("%p %d\n", &a[i],a[i]);
return 0;
}
對static數組元素不賦初值,系統會自動賦以0值
static int a[5];
//等價於:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0;
只給部分數組元素賦初值
int a[5]={6,2,3};
//等價於:a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
int a[3]={6,2,3,5,1}; // 報錯(×)
二維數組
二維數組的
實際上我們定義的二維數組在內存中仍然像是一維數組那樣連續存儲的。可以想象爲把一個矩陣一層層伸展鋪平。其中行許優先。 比如定義了一個array[3][4],那就指的是定義了一個三行四列的矩陣形狀的二維數組,如下圖所示。
- 二維數組Array由3個元素構成,即Array[0],Array[1],Array[2]
- 其中每個Array[i]是包含4個元素的一維數組
二維數組定義和初始化
// 可以使用下面的方法來初始化二維數組,也就是直接將二維數組鋪平,寫成一維數組的形式
int array[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// 可以使用標準的二維數組的初始化方式
int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
//可以不用指明二維數組的行數,但要指明列數
int array[][4];
二維數組的使用
#include<stdio.h>
int main(){
int a[3][4],i,j;
int count = 0;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
a[i][j]=count++;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
return 0;
}
注意:必須強調的是,a[0],a[1],a[2]不能當作下標變量使用,它們是數組名,不是一個單純的下標變量