C語言的數組
數組聲明的實例:int num[3];只要記下這個模板就好。
不建議使用變量定義數組,如果使用了變量定義數組,作為數組的元素的個數,不初始化的情況下是隨機值,如果初始化會直接報錯
注意:如果定義的同時進行初始化,那么元素的個數可以省略
省略之后,初始化賦值幾個數據,那么數組的長度就是幾,也就是說數組將來就能存儲幾個數據。
int scores[] = {1,3};//只有兩個存儲空間了
如果沒有進行初始化,就不能省略元素個數:
錯誤的:int scores[];
可以通過[]索引指定賦值
int scores[100] = {[87] = 1,[34] = 29};
獲得數組的長度可以用sizeof
1 #include <stdio.h>
2
3 int main(int argc, const char * argv[]) {
4
5 int a[5];
6 printf("數組的長度:%i\n",(int)(sizeof(a)/sizeof(a[0])));
7 return 0;
8 }
當數組名作為函數參數時, 因為自動轉換為了指針類型,所以在函數中無法動態計算除數組的元素個數
1 void printArray(int array[])
2 {
3 printf("printArray size = %lu\n", sizeof(array)); // 8
4 int length = sizeof(array)/ sizeof(int); // 2
5 printf("length = %d", length);
6 }
小何說兩句:
1.看樣子,在C語言中無法將動態計算數組長度的方法模塊化編程
2.在java中中的數組是可以這樣的:
public class Main{
public static void main(String[] args){
int n = 10;
int a[] = new int[n];
System.out.println(a.length);
}
但是在C語言中,是不能用變量如上面Java代碼這樣可以動態指定數組聲明時的長度的。
int a = 10;
int b[a];
但是在java語言中,數組的聲明不能指定長度,也就是不能這樣int[3] a或者int a[3],java只能在初始化的時候指定數組長度。
在C++中聲明數組也是和C語言一樣的,聲明格式:
數據類型 數組名[常量表達式] 例如:int array[10];常量表達式中可以包括整型常量和整型表達式,但不能是變量。
C++和C語言不允許對數組的大小作動態定義。
在Swift和Objective-C中,數組的長度是動態可變的。
3.但是C語言在訪問數組的時候,指定索引可以用變量來指定。比如;
int a[3]={1,2,3};
int n = 2;
printf("%d\n", a[n]);
小何說兩句習題的一個知識亮點:
雖然這是一個很簡單的習題,但是其中的小思想是可以積累的。
##1.設計一個函數int arrayMax(int a[], int count)找出數組元素的最大值
1 int getMax(int ages[], int length)
2 {
3 // 注意:不要假設數組以外的值位最大值,會出現意想不到的問題
4 // int max = 0;
5 // 假設數組中的第0個元素是最大
6 int max = ages[0];
7
8 for (int i = 0; i < length; i++) {
9 // 判斷從數組中取出的值是否大於max
10 if (max < ages[i]) {
11 // 如果大於max就把當前索引對應的元素設置成最大值
12 max = ages[i];
13 }
14 }
15
16 return max;
17 }
1 int getMax(int ages[], int length)
2 {
3 // 把數組中的第0個索引作為最大值
4 int max = 0;// 是一個索引
5 for (int i = 1; i < length; i++) {
6 if (ages[max] < ages[i]) {
7 max = i;
8 }
9 }
10 return ages[max];
11 }
前面一個算法,也是我開始的思路,不過我采用三元運算符替代了條件語句,雖然代碼看起來精簡,但是本質上沒有啥改變。
然后我看到第二個算法,相比第一個算法思想,就是直接面向最大值編程,而第二個算法是面向最大值的索引編程,也就是說,如果這個值是最大的,那我就操作這個值得索引好了,反正通過索引就一定能夠得到這個最大值。
不過第二種面向索引寫算法的思想一般用在這種集合元素不變動的情況,如果集合在算法中變動的話,就有可能出現通過索引獲取不正確的值。
好,閱讀到這里,不管讀者是重新閱讀這段內容還是第一次閱讀這段內容都嘗試着不看源代碼自己面向索引寫這個小題的算法吧。
以下就是作者的練習代碼:
1 #include <stdio.h>
2
3 //設計一個函數int arrayMax(int a[], int count)找出數組元素的最大值
4 //面向元素具體值寫算法
5 int arrayMax(int a[],int count)
6 {
7 int max = a[0];
8 for (int i=0; i<count; i++) {
9 max = (max>a[i])?max:a[i];
10 }
11 return max;
12 }
13
14 //面向索引寫算法
15 int arrayMax2(int a[],int count)
16 {
17 //定義一個最大值的索引,比如這里的最大值索引是數組中的第一個
18 int max = 0;
19
20 for (int i=0; i<count; i++) {
21 max = (a[max]>a[i])?max:i;
22 }
23 return a[max];
24 }
25
26 int main(int argc, const char * argv[]) {
27 int a[5] = {12,2,2,3,23};
28 printf("最大值是:%d\n",arrayMax2(a,5));
29 return 0;
30 }
面向索引值寫的算法在集合類的使用中可以起到減少算法空間復雜度的作用。
因為索引所占的空間往往就是int的所占的空間。