http://www.jb51.net/article/83728.htm
2016
數(shù)組
可以存儲一組或者多組數(shù)值的變量,里面包含多個元素,數(shù)組的每個成員都是一個數(shù)組元素。
一維數(shù)組
定義:類型 數(shù)組名[常量表達(dá)式] = {值1, 值2, 值3…};
1 2 3 4 | int a[3] = {0, 1, 2};
float f[2] = {1.2, 2.3, 3.14};
char str[] = { 'h' , 'e' , 'l' , 'l' , 'o' };
chat str1 = "iPhone" ; //這也是定義字符數(shù)組的方法,字符數(shù)組后面會詳細(xì)講解,這里先了解一下
|
當(dāng)數(shù)組元素個數(shù)為變量時,只能聲明數(shù)組,不能直接賦值:
1 2 3 | int length = 4;
int a[length]; //這樣可以
int a[length] = {2, 4, 6, 8}; //這樣的話就會報錯
|
注意事項:
1、系統(tǒng)不會檢測數(shù)組元素的下標(biāo)是否越界,編程時,必須保證數(shù)組下標(biāo)不能越界。
2、不能這樣定義數(shù)組 int array[] = {}; //數(shù)組個數(shù)和初始值不能同時為空
3、也不能這樣定義數(shù)組 int array[2] = {1, 2, 3}; //數(shù)組的值的個數(shù)大于數(shù)組的個數(shù)
4、數(shù)組是一個整體,不能直接參加運(yùn)算,只能對單個元素進(jìn)行處理,通常用到數(shù)組的地方都會用到循環(huán)
常見數(shù)組操作
如果初始化數(shù)組的時候,數(shù)組的元素個數(shù)確定,那么常量表達(dá)式可以不寫:
1 | int a[] = {1, 3, 5, 7, 9}; //數(shù)組的長度為5 相當(dāng)于int a[5] = {1, 3, 5, 7, 9};
|
int 就是數(shù)組類型,表示這個數(shù)組中的每個元素都是 int 類型。
訪問:通過數(shù)組名+下標(biāo)去訪問數(shù)組中的元素,而且注意數(shù)組的下標(biāo)是從 0 開始的,a[0] 就是第一個元素,a[1] 代表第二個元素,a[2] 代表第三個元素。所以數(shù)組的最后一個元素就是 數(shù)組的長度 – 1,一定不要寫a[3],這樣的話就屬于數(shù)組越界。
在數(shù)組的訪問的時候我們通常會通過 for 循環(huán)來操作,這個操作一般稱為遍歷
1 2 3 4 5 6 7 8 9 10 11 12 | int ages[28];
//循環(huán)賦值
for ( int i = 0; i < 28; i++)
{
int age = arc4random() % 13 + 18; //每個人的年齡的范圍是:18 ~ 30 之間的隨機(jī)值
ages[i] = age; //給每個元素賦值
}
//訪問,也叫遍歷
for ( int i = 0; i < 28; i++)
{
printf ( "a[%d] = %d " , i, ages[i]);
}
|
兩個數(shù)組的每個元素對應(yīng)相加,相加的和存放到第三個數(shù)組中:
1 2 3 4 5 6 7 8 | int a1[] = {2, 4, 5, 6, 10};
int a2[] = {1, 3, 4, 5, 6};
int a3[5];
for ( int i = 0; i < 5; i++)
{
a3[i] = a1[i] + a2[i];
printf ( "a3[%d] = %d " , i, a3[i]);
}
|
輸出結(jié)果為:
1 | a3[0] = 3 a3[1] = 7 a3[2] = 9 a3[3] = 11 a3[4] = 16
|
數(shù)組的長度如何計算:
sizeof(數(shù)組名)/sizeof(數(shù)組第一個元素)
1 2 3 | int arr[] = {2, 3, 4, 6, 7};
int length = sizeof (arr) / sizeof (arr[0]);
printf ( "length = %d\n" , length);
|
輸出結(jié)果為:
字符數(shù)組:用于存放字符變量的數(shù)組稱為字符數(shù)組,有兩種定義格式:
1 2 | char str[4] = { 'a' , 'b' , 'c' , 'd' };
char str2[] = "iPhone" ; //另外一種方式
|
字符串的輸出:
1 | printf ( "str2 = %s\n" , str2); //%s 輸出字符串,遇到 '\0' 結(jié)束
|
有'\0'結(jié)束標(biāo)識的字符數(shù)組也稱為字符串,系統(tǒng)提供了許多的一些字符串的函數(shù)
size_t strlen(const char *):計算字符串長度,是字符串的有效長度,不算'\0′
1 2 3 | char str[] = "iPhone" ;
unsigned long length = strlen (str); //strlen 表示有效長度
printf ( "length = %lu\n" , length);
|
輸出結(jié)果為:
strlen() 的實現(xiàn)原理:就是遍歷字符串,當(dāng)遇到 ‘\0′ 的時候就結(jié)束。
char *strcpy(char *, const char *):字符串拷貝
1 2 3 | char str1[] = "Unity" ;
char str2[] = "Android....." ;
printf ( "%s\n" , strcpy (str1, str2));
|
輸出結(jié)果:
char *strcat(char *, const char *):字符串拼接
1 2 3 | char str1[] = "Unity" ;
char str2[] = " iPhone" ;
printf ( "%s\n" , strcat (str1, str2));
|
輸出結(jié)果:
int strcmp(const char str1*, const char str2*):字符串比較,并且根據(jù) str1 按照字典順序小于、等于或大于 str2 的結(jié)果分別返回負(fù)整數(shù)、0或正整數(shù)。該返回值是 str1 和 str2 由前向后逐字符比較時遇到的第一個不相等字符處的字符的差值
1 2 3 | char str1[] = "Unity" ;
char str2[] = "iPhone" ;
printf ( "%d\n" , strcmp (str1, str2));
|
輸出結(jié)果:
-20
指針訪問數(shù)組
如果pa指向數(shù)組中的某個元素,那么pa+1將指向下一個元素,pa+i指向下i個元素。所以,若果pa指向a[0],那么*pa其實就是a[0],*(pa+1)就是a[1],*(pa+i)就是a[i]。根據(jù)這個思路,我們可以使用指針來訪問數(shù)組。
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h>
int main( int argc, char *argv[])
{
int score[10]={76,85,90,67,59,79,82,95,91,65};
int wait, length, i;
length = sizeof (score) / sizeof (score[0]);
for (i = 0; i < length; i++)
{
printf ( "%d \n" , *(score + i));
}
scanf ( "%d" , &wait);
}
|
程序輸出:
數(shù)組下標(biāo)與指針關(guān)系很密切。執(zhí)行語句 pa = &a[0] 后,pa 和 a 就具有相同的值了,并且 *pa=a[0]。實際上C語言在計算數(shù)組下標(biāo)時也是使用指針來完成的。下標(biāo)與指針其實是等價的。
當(dāng)把一個數(shù)組名傳遞給一個函數(shù)的時候,實際上傳遞的是該數(shù)組的第一個元素的地址。所以,數(shù)組名參數(shù)必須是一個指針。
計算字符串長度的程序可以寫成以下:
1 2 3 4 5 6 7 8 | int strlen ( char *s)
{
int n;
for (n = 0; *s != '\0' ; s++)
n++;
return n;
}
|
s 是指針,也就是一個變量,對它進(jìn)行自增是合法的。