1.什麼是數組程序員
數組,從字面上看,就是一組數據的意思,沒錯,數組就是用來存儲一組數據的數組
2.數組的使用場合數據結構
一個int類型的變量能保存一我的的年齡,若是想保存整個班的年齡呢?函數
第一種方法是定義不少個int類型的變量來存儲設計
第二種方法是隻須要定義一個int類型的數組來存儲排序
3.數組的特色索引
只能存放一種類型的數據,好比int類型的數組只能存放int類型數據內存
數組中存放的每個數據稱爲「元素」字符串
元素有順序之分,每一個元素都有一個惟一的下標(索引),從0開始編譯器
數組的定義、初始化、使用
數組的定義
元素類型 數組名[元素個數];
好比:int ages[10];
數組的初始化
通常會在數組定義的同時進行初始化
int ages[3] = {4, 6, 9};
數組元素的訪問
經過下標(索引)訪問:ages[0]=10; int a = ages[2];
C程序的內存分配
一個由C/C++編譯的程序佔用的內存分爲如下幾個部分
一、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數名,局部變量的名等。其操做方式相似於數據結構中的棧。
二、堆區(heap)— 由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。
三、全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。程序結束後由系統釋放。
四、文字常量區 — 常量字符串就是放在這裏的,程序結束後由系統釋放 。
五、程序代碼區 — 存放函數體的二進制代碼。
數組的內存分配
定義數組時,系統將按照數組類型和個數分配一段連續的存儲空間來存儲數組元素,如int a[2]佔據了連續的8字節存儲空間(在64位編譯器環境下,一個int類型佔用4個字節)
要注意的是,數組名錶明着整個數組的地址,也就是數組的起始地址
數組a的地址是ffc1,a[0]的地址是ffc1,a[1]的地址是ffc5
所以a == &a[0],即第一個元素的地址就是整個數組的地址
常見錯誤
int a[];
int[4] a;
int a[b];
a = {10, 11};
a[4] = {10,9,8,5};
數組越界的注意
數組與函數實參
數組的元素做爲函數實參,與同類型的簡單變量做爲實參同樣,是單向的值傳遞,即數組元素的值傳給形參,形參的改變不影響實參
若是一維數組的名字做爲函數實參,傳遞的是整個數組,即形參數組和實參數組徹底等同,是存放在同一存儲空間的同一個數組。這樣形參數組修改時,實參數組也同時被修改了。形參數組的元素個數能夠省略
數組的遍歷
遍歷的意思就是有序地查看數組的每個元素
遍歷方式1
int arr[4] = {1, 3, 5, 7};
for (int i = 0; i<4; i++) {
printf("arr[%d]=%d\n", i, arr[i]);
}
遍歷方式2
int arr[4] = {1, 3, 5, 7};
int length = sizeof(arr)/sizeof(int);
for (int i = 0; i<length; i++) {
printf("arr[%d]=%d\n", i, arr[i]);
}
數組常見操做
求出最大值,最小值
排序(冒泡,選擇)
折半查找:折半查找前提:數組必須是有序的。
1.設計一個函數int arrayMax(int a[], int count)找出數組元素的最大值
2.設計一個函數:int arraySum(int a[], int n),求一維數組a前n個數的和
3.寫一個函數,能夠將一維整型數組中的元素逆序存放。好比原本是1,3,4,2,逆序存放就變成了:2,4,3,1