一維數組是最簡單的數組,其邏輯結構是線性表。要使用一維數組,需經過定義、初始化和應用等過程。
一、一維數組的創建和初始化
創建方式:
type_t arr_name [const_n]; //type_t 數組的元素類型(int char等)
//const_n 常量表達式,指定數組的大小(不能使用變量)
初始化:
在創建數組的同時要給數組的內容一些合適初始值。
eg: int arr[10] = {1, 2, 3};
int arr[] = {1, 2, 3, 4};
char arr[3] = {'a', 98, 'c'};
char arr[] = "abcdef";
數組在創建時如果想不指定數組的確定大小就需要初始化,數組的元素個數根據初始化的內容來分配。
二、一維數組的使用
數組定義時有一個操作符 [ ],這是下標引用操作符,它就是數組訪問的操作符。
比如:
int arr[10] = { 0 }; //數組的不完全初始化
int i = 0; //i爲下標
for(i = 0; i < 10; i++)
{
arr[i] = i;
}
這是一個對數組的一個簡單定義,數組是使用下標來訪問的,下標從0開始。
tips:數組的大小可以通過計算得到,sz爲數組大小,代碼如下。
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
三、一維數組在內存中的存儲
數組內的元素在內存中是連續存放的。
可以通過打印出地址的方式來驗證。
四、一維數組的指針訪問
我們得知數組的數組名是數組首元素的地址,而數組名+整數既是對應元素的地址。
可以通過*(數組名+整數)的方式,利用指針來訪問數組。
二維數組
前面介紹的數組只有一個下標,稱爲一維數組, 其數組元素也稱爲單下標變量。在實際問題中有很多量是二維的或多維的, 因此C語言允許構造多維數組。多維數組元素有多個下標, 以標識它在數組中的位置,所以也稱爲多下標變量。本小節只介紹二維數組,多維數組可由二維數組類推而得到。
一、二維數組的創建和初始化
創建:
type_t arr_name [const_n1] [const_n2];
其中常量表達式1 const_n1代表第一維下標的長度,常量表達式2 const_n2代表第二維下標的長度。
初始化:
int a[3][4] = {.......};
二、二維數組的使用
和一維數組相同,二維數組的使用也是通過下標的方式。
三、二維數組在內存中的存儲
通過打印出數組的每個元素得出,二維數組在內存中也是連續存儲的。
(且低地址到高地址是按行從低到高分配的)
四、二維數組的指針訪問
1、動態數組方式。
完全由動態數據構成二維數組。如M行N列的數組,先分配M個一維指針空間,然後在每個一維指針上分配N個元素 的空間,即成爲動態二維數組。和普通數組不同,這種動態二維數組的各行之間地址並不連續
2、通過數組指針指向已有二維數組。
對於已經定義好的M行N列數組,可以使用指向N個元素的數組指針,指向該數組並訪問。
如:
int arr[3][4] = {0};
int *p = &arr[0][0];
*(p+i) = i; //此時就用指針訪問了二維數組
總結:
在絕大多數表達式中,數組名的值是指向數組第1個元素的指針。這個規則有兩個情況例外:1.sizeof(數組名),這裏的數組名錶示的是整個數組。2.&數組名,這裏的數組名錶示整個數組。
指針和數組並不相等,數組的屬性和指針的屬性大相徑庭。當我們聲明一個數組時,它同時也分配了一些內存空間,用來容納數組元素。但是當我們聲明一個指針時,它只分配了用於容納指針本身的空間。
當數組名作爲函數參數傳遞時,實際傳遞給函數的是一個指向數組第1個元素的指針。函數所接收到的參數實際上是原參數的一份拷貝,所以函數可以對其操作而不會影響實際的參數。但是對指針參數執行間接訪問操作允許函數修改原來的數組元素。數組形參可以聲明爲數組,也可以聲明爲指針。這兩種聲明形式只有當它們作爲函數的形參時才相等。