? ? ? ? 今天繼續來淺淺推進一下C語言的復習,這次是數組的復習,話不多說,正文開始.
數組的概念
????????數組是?組相同類型元素的集合,一種自定義類型.數組中元素個數不能為0.數組分為?維數組和多維數組,多維數組?般?較多?的是?維數組.
? ? ? ? 下面從一維數組說起.
一維數組的創建和初始化
??數組創建
?????????維數組創建的基本語法如下:(數組在創建的時候可以指定數組的大小和數組的元素類型).
type arr_name[常量值];
????????1.type 指定的是數組中存放數據的類型,可以是: char、short、int、float 等,也可以自定義的類型
? ? ? ? 2.arr_name 指的是數組名的名字
? ? ? ? 3.[] 中的常量值是?來指定數組的大小的
??數組的初始化
????????數組在創建的時候,我們需要給定?些初始值值,這種就稱為初始化.數組的初始化?般使??括號,將數據放在?括號中.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>void Print(int arr[], int sz)
{for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}
int main()
{//完全初始化int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };//不完全初始化:其余的會被默認初始化為0int arr2[10] = { 1,2 };//[]中不寫,初始化為幾個就是幾個元素int arr3[] = { 1,2,3,4,5 };Print(arr1, 10);Print(arr2, 10);Print(arr3, sizeof(arr3)/sizeof(arr3[0]));return 0;
}
??數組的類型
????????數組也是有類型的,數組算是?種?定義類型,去掉數組名留下的就是數組的類型.
int arr[10]的類型就是int [10];
char ch[5]的類型是 char [5];
一維數組的使用
? ? ? ? 簡單的了解了一維數組后,讓我們復習一下它的使用.
??數組下標
????????定數組是有下標的,下標是從0開始的,假設數組有n個元素,最后?個元素的下標是n-1.如下圖:
? ? ? ? 我們通常用下標引用符[ ]來訪問數組元素.例如我們訪問下標為7的元素,我們就可以使用arr[7].
??數組元素的打印和輸入
? ? ? ? 在上面初始化中為了看見初始化的結果,我已經將打印的代碼先使用了.因為數組用下標訪問,所以只要便利數組下標就可以打印數組了.
? ? ? ? 數組的輸入與打印類似,大概如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>void Print(int arr[], int sz)
{for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{int arr[10] = { 0 };for (int i = 0; i < 10; i++){scanf("%d", &arr[i]);}Print(arr, 10);return 0;
}
? 一維數組在內存中的存儲
? ? ? ? 想要了解一維數組在內存中的存儲最好的方法就是打印數組中每個元素的地址.代碼和結果如下圖.
? ? ? ? 由上圖輸出結果可知,每兩個元素之間都隔離四個字節,而一int類型就占四個類型.所以我們得出結論:數組在內存中是連續存放的.
??sizeof計算數組元素個數
????????在遍歷數組的時候,我們經常想知道數組的元素個數.在C語言中我們可以用sizeof來實現.
????????sizeof中C語?是?個關鍵字,是可以計算類型或者變量大小的,(他的返回值是所計算類型或變量所占的字節數),其實 sizeof 也可以計算數組的大小.如下
int main()
{int arr[10] = { 0 };printf("%d\n", sizeof(arr));return 0;
}
? ? ? ? 因為數組中所有元素的類型都是相同的,那只要計算出?個元素所占字節的個數,數組的元素個數就能算出來。這?我們選擇第?個元素算大小就可以.然后二者相除就可以得出數組元素個數.
int main()
{int arr[10] = { 0 };int a = sizeof(arr) / sizeof(arr[0]);printf("%d\n", a);return 0;
}
? ? ? ? 有了這個方法,以后在代碼中需要數組元素個數的地?就不用固定寫死了,使用上面的計算,不管數組怎么變化,計算出的大小也就隨著變化了.
二維數組
? 二維數組得概念
????????前?學習的數組被稱為?維數組,數組的元素都是內置類型的,如果我們把?維數組做為數組的元素,這時候就是二維數組,?維數組作為數組元素的數組被稱為三維數組,二維數組以上的數組統稱為多維數組.
? 二維數組的創建和初始化
? ? ? ? 二維數組的創建:
type arr_name[常量值1][常量值2];
常量值1表示二維數組有幾行
常量值2表示二維數組有幾列
type是元素類型
arr_name是數組名
????????那?維數組如何初始化呢?像?維數組?樣,也是使??括號初始化的.
? ? ? ? 不完全初始化
int main()
{//不完全初始化int arr1[3][5] = { 1,2,3,4,5 };for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", arr1[i][j]);}printf("\n");}printf("\n");//按照?初始化int arr2[3][5] = { {1,2},{3},{4,5} };for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", arr2[i][j]);}printf("\n");}return 0;
}
? ? ? ? 輸出結果
? ? ? ? 完全初始化
int main()
{//完全初始化int arr1[2][5] = { 1,2,3,4,5,6,7,8,9,0};for (int i = 0; i < 2; i++){for (int j = 0; j < 5; j++){printf("%d ", arr1[i][j]);}printf("\n");}return 0;
}
? ? ? ? 輸出結果
????????類似于一維數組,初始化時省略行,但是不能省略列
int main()
{int arr1[][5] = { 1,2,3,4,5,6 };for (int i = 0; i < 2; i++){for (int j = 0; j < 5; j++){printf("%d ", arr1[i][j]);}printf("\n");}return 0;
}
????????輸出結果
? 二維數組的使用
?????????維數組訪問也是使?下標的形式的,?維數組是有?和列的,只要鎖定了?和列就能唯?鎖定 數組中的?個元素.
? ? ? ? 如上圖,最右側綠?的數字表示行號,第??藍?的數字表?列號,都是從0開始的,
????????例如,我們說:第2行,第4列,快速就能定位出7.
? 二維數組的輸入和輸出
? ? ? ? 同樣在上面為了觀察初始化的結果,我已經使用了二維數組的輸出,輸入與輸出類似.代碼見下
int main()
{int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };int i = 0;//輸?for (i = 0; i < 3; i++) //產??號{int j = 0;for (j = 0; j < 5; j++) //產?列號{scanf("%d", &arr[i][j]); }}//輸出for (i = 0; i < 3; i++) //產??號{int j = 0;for (j = 0; j < 5; j++) //產?列號{printf("%d ", arr[i][j]); }printf("\n");}return 0;
}
? 二維數組在內存中的存儲?
????????像?維數組?樣,如果想研究?維數組在內存中的存儲?式,我們也是可以打印出數組所有元素的地址.結果如下
????????從輸出的結果來看,每??內部的每個元素地址之間都相差4個字節,跨?位置處的兩個元素(如:arr[0][4]和arr[1][0])之間也是差4個字節,所以?維數組中的每個元素都是連續存放的.如下圖所示
? ? ? ? 還有一點點為c99中的變長數組,了解即可~以上就是所有復習內容啦,下篇復習見~