數組的概念
數組是一組有序的、類型相同的數據的集合,這些數據稱爲數組的元素
一維數組
- 定義
語法格式:類型說明符 數組名[正整型常量表達式]
類型說明符指定數組的類型,數組名和變量名命名規則相同
方括號內是數組的長度,下標或方括號的個數稱爲數組的維度
數組元素的類型稱爲數組的基類型
不允許使用變量對數組大小進行定義,數組的說明語句必須在可執行語句之前 - 初始化
1)對全部元素初始化:int a[5]={1,2,3,4,5};
或int a[] ={1,2,3,4,5};
,即對全部元素賦值可以不指定長度
2)對部分元素賦值,其他按0處理:int a[9] = {1,2};
,這樣a[0]=1,a[1]=2,其他元素爲0
3)一維數組賦值的個數不能超過數組長度 - 一維數組的引用
1)一次只能引用單個數組元素,不能一次引用整個數組
2)數組名是數組的首地址,即a[0]的地址,是一個地址常量
3)數組元素是一個數值,引用數組元素時,根據首地址和下標自動計算元素的實際地址
4)不能直接數組a = 數組b
的方式賦值,因爲數組b只是一個地址,並不是實際的值
5)要讓一個數組賦值給另一個數組要逐個元素賦值或使用循環賦值 - 程序實例
1)利用數組計算斐波那契數列的前20個數,並以每行5個輸出
2)隨機輸入6個整型數字,利用冒泡排序法排序#include<stdio.h> int main(){ int F[20],i; F[0] = F[1] = 1; for (i=2;i<20;i++){ F[i] = F[i-1]+F[i-2]; } for (i=0;i<20;i++){ if(i%5==0){ printf("\n"); } printf("%6d",F[i]); } return 0; }
#include<stdio.h> int main(){ int a[6],i,j,tmp,p; for(i=0;i<6;i++){ scanf("%d",&a[i]); } printf("\n"); for(i=0;i<6-1;i++){ for(j=1;j<6-i;j++){ if(a[j-1]>a[j]){ tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } for(p=0;p<6;p++){ printf("%d ",a[p]); } printf("\n"); } return 0; } }
二維數組
- 定義
語法格式:類型說明符 數組名[正整型常量表達式][正整型常量表達式]
二維數組在內存中按行的順序存放
其他定義條件與一維數組相同 - 初始化
1)分行給二維數組賦值:int a[2][3] = {{2,3,1}, {1,2,3}};
2)全部元素按順序賦值:int a[2][3] = {2,3,1,1,2,3};
或int a[ ][3] = {2,3,1,1,2,3};
,即第一個下標可以省略
3)對部分元素賦值:int a[2][3] = {{1},{0,1},{0,0,1}};
、int a[2][3] = {{1},{},{0,0,1}};
、int a[2][3] = {{5,6},{7,8}};
、int a[2][3] = {5,6,7,8};
- 二維數組的引用
1)數組名是數組的首地址,即a[0][0]的地址,是一個地址常量
2)數組名是常量,不能對其賦值 - 程序實例
將一個矩陣a={{1,2,3},{4,5,6}}轉置存到另一個矩陣b中#include<stdio.h> int main(){ int a[][3] = {{1,2,3},{4,5,6}}; int b[2][3],i,j; for(i=0;i<2;i++){ for(j=0;j<3;j++){ b[j][i] = a[i][j]; } } for(i=0;i<3;i++){ for(j=0;j<2;j++){ printf("%d ",b[i][j]); } printf("\n"); } return 0; }
字符數組與字符串
- 定義
C語言用字符數組存放字符串
語法格式:char 數組名[正整型常量表達式]
字符串實際佔有存儲單元的數量等於字符串長度+1,因爲還要存一位結束符 \0
- 初始化
1)用單個字符對字符數組初始化
char ch[6] = {'C','H','I','N','A','\0'};
初值個數少於數組長度時,系統會自動添加結束符
初值個數(包括結束符)等於數組長度時,定義時可以省略長度
初值個數超過數組長度時,會報錯
2)用字符串常量對字符數組初始化
char ch[6] = "china";
或char ch[] = "china"
長度爲n的數組,只能存n-1個字符,剩下的一位要給結束符
即char d[12]="How are you";
等價於char d[12] = {'H','o','w','' ','a','r','e',' ' ,'y','o','u','\0'};
在循環結構中可以用結束符來控制循環
字符數組的輸入和輸出
- puts輸出字符串函數、使用printf和%s輸出字符串
puts函數輸出後會自動換行,而printf不會#include<stdio.h> int main(){ char a[] = "book"; printf("%s",a); puts(a); return 0;}
- gets輸入字符串函數、使用scanf和%s輸出字符串
gets可以接收空格,scanf不能
使用scanf時數組名前不用&號
&號的含義是取地址,而數組名本身就有代表地址的意思#include<stdio.h> int main(){ char a[12]; gets(a); //輸入How are you puts(a); //輸出How are you scanf("%s",a); //輸入How are you puts(a); //輸出How return 0;}
- 字符串處理函數,需要<string.h>
1)strcat(字符數組1, 字符數組2):連接兩個字符串
2)strcpy(字符數組1, 字符數組2):將2拷貝到1中,1的長度應大於2
3)strlen(字符數組):返回數組的長度(不包括\0)
4)strlwr(字符數組):將大寫字符串變爲小寫字符串
5)strmp(字符數組1, 字符數組2):字符串的比較- 比較兩個字符串第一個不同字符的ACSII碼的大小
- 如果全部字符都相等,返回0
- 如果有不相等的,返回該位置字符的ACSII碼之差