1、介紹數(shù)組
一個(gè)常量變量就是一個(gè)用來存儲(chǔ)數(shù)值的命名區(qū)域。同樣,一個(gè)數(shù)組就是一個(gè)用來存儲(chǔ)一系列變量值的命名區(qū)域,因此,可以使用數(shù)組組織常量變量。也就是說,數(shù)組是一組有序數(shù)據(jù)的集合,存儲(chǔ)在數(shù)組中的值稱為數(shù)組元素。每個(gè)數(shù)組元素有一個(gè)相關(guān)的索引(也稱為關(guān)鍵字),它可以用來訪問元素。在大多數(shù)編程語言中,數(shù)組都具有數(shù)字索引,而且這些索個(gè)通常是從0或1開始的。數(shù)組中的每個(gè)元素都屬于同一個(gè)數(shù)據(jù)類型。
一維數(shù)組是由數(shù)字組成的以單純的排序結(jié)構(gòu)排列的結(jié)構(gòu)單一的數(shù)組。一維數(shù)組是計(jì)算機(jī)程序中最基本的數(shù)組。二維及多維數(shù)組可以看作是一維數(shù)組的多次疊加產(chǎn)生的。
2、一維數(shù)組
當(dāng)數(shù)組中每個(gè)元素都只帶有一個(gè)下標(biāo)時(shí),稱這樣的數(shù)組為一維數(shù)組。通過給出的數(shù)組名稱和這個(gè)元素在數(shù)組中的位置編號(hào)(即下標(biāo)),程序可以引用數(shù)組中的任意一個(gè)元素,一維數(shù)組的引用定義格式為:類型+數(shù)組名[下標(biāo)]如:int ?a[10]
其中,a是一維數(shù)組的數(shù)組名,該數(shù)組有10個(gè)元素,依次表示為a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]。需要注意的是,數(shù)組是從零開始是,所以a[10]不屬于這一個(gè)數(shù)組的空間范圍中。當(dāng)在說明部分定義了一個(gè)數(shù)組變量后,編譯程序會(huì)在內(nèi)存空間中開辟一串連續(xù)的存儲(chǔ)單元。對(duì)于數(shù)組而言,程序的執(zhí)行部分使用的是數(shù)組變量而不是數(shù)組類型。在引用時(shí),下標(biāo)必須是整數(shù),但可以是整型變量或整型表達(dá)式。如果使用表達(dá)式,會(huì)先計(jì)算表達(dá)式以確定下標(biāo)。程序只能逐個(gè)應(yīng)用數(shù)組中的元素而不能一次引用整個(gè)數(shù)組,再定義數(shù)組時(shí),需要指定數(shù)組中元素的個(gè)數(shù),方括號(hào)里邊的常量數(shù)值表示了數(shù)組的長度。在數(shù)組定義前加const關(guān)鍵字可將整個(gè)數(shù)組變?yōu)橹蛔x,將不再可以對(duì)數(shù)組進(jìn)行寫入數(shù)據(jù)。
如:int a;? float a[10]; (非法)? ? int n=5;? int a[n];(非法)? ? int a[5+6]; (合法的)
初始化:(注意,在使用數(shù)組之前,一定要先初始化)
1、數(shù)組的初始化可以在定義時(shí)一并完成
2、可以只給部分元素賦初值,其他的元素賦0。
3、如給全部元素賦值,則在數(shù)組中說明,可以不給出數(shù)組元素的個(gè)數(shù)
4、數(shù)組的初始化可以是用循環(huán)進(jìn)行輸入數(shù)值賦值,也可以是在程序中指定賦值
例子:
?
#include//尋找數(shù)字并查看在哪個(gè)位置 int search(int n, int a[], int max); int main(void) { int a[] = {1,6,5,7,4,3,2,8,11,9,10};//初始化一 /* int a[10] = {0}//初始化二 全都初始化為零 for (i = 0; i < 10; i++) {//初始化三自己輸入初始化(這種初始化最好定義在二之上,否則其他如果有元素沒有被賦值的話會(huì)出錯(cuò)) scanf("%d", &a[i]); } */ int n; scanf("%d", &n); //整個(gè)數(shù)組占用的字節(jié)數(shù)可用sizeof(a)表示出來 int h = search(n, a, sizeof(a) / sizeof(a[0]));//用整個(gè)數(shù)組占用的字節(jié)數(shù)除以首元素的字節(jié)數(shù)可知道數(shù)組的大小 if (h != -1) { printf("%d在第%d位上", n, h+1); }else { printf("沒有這個(gè)數(shù)字"); } return 0; } int search(int n, int a[], int max) { int t = -1; int i; for (i = 0; i < max; i++) {//遍歷數(shù)組 if (n == a[i]) { t = i; break; } } return t; }
?
3、二維數(shù)組
二維數(shù)組本質(zhì)上是以數(shù)組作為數(shù)組元素的數(shù)組即“數(shù)組的數(shù)組”,類型說明符 數(shù)組名[ 常量表達(dá)式][常量表達(dá)式]。
二維數(shù)組又稱為矩陣,行列數(shù)相等的矩陣稱為方陣。
對(duì)稱矩陣a[i][j]=a[j][i]二維數(shù)組A[m][n],這是一個(gè)m行,n列的二維數(shù)組。設(shè)a[p][q]為A的第一個(gè)元素,即二維數(shù)組的行下標(biāo)從p到m+p,列下標(biāo)從q到n+q,按“行優(yōu)先順序”存儲(chǔ)時(shí)則元素a[i][j]的地址計(jì)算為:(t為一個(gè)字節(jié)數(shù))LOC (a[i][j]) = LOC(a[p][q]) + ((i?p) * n + (j ?q)) * t 按“列優(yōu)先順序”存儲(chǔ)時(shí),地址計(jì)算為:LOC(a[i][j]) = LOC(a[p][q]) + ((j ?q) * m + (i?p)) * t存放該數(shù)組至少需要的單元數(shù)為(m-p+1) * (n-q+1) * t 個(gè)字節(jié)二維數(shù)組只是形式上的二維,但是在計(jì)算機(jī)內(nèi)部它的存儲(chǔ)方式還是連續(xù)的線性的。它只是一種特殊的一維數(shù)組。
二維數(shù)組的定義和一維數(shù)組的概念規(guī)則基本相似,一般形式為:類型說明符+數(shù)組名【常量表達(dá)式】【常量表達(dá)式】。
初始化稍有不同
注意,二維數(shù)組的列數(shù)是必須要給出的,行數(shù)是可以有編譯器來數(shù)。
每行一個(gè){},逗號(hào)分離
最后的的逗號(hào)可以存在(有古老的傳統(tǒng))
如果省略,表示補(bǔ)零
例子:楊輝三角
?
#include//楊輝三角 int main(void) { int n; scanf("%d", &n); int i, j; int a[100][100] = { 0 };//先把所有元素初始化為零 //由與二維數(shù)組有兩個(gè)下標(biāo),所以它的遍歷需要雙重循環(huán)來實(shí)現(xiàn) for (i = 0; i < n; i++) { a[i][0] = a[i][i] = 1;//將第一位數(shù)字和最后一位數(shù)組初始化為1 } int t; for (i = 1; i <=n; i++) {//遍歷賦值 for (j = 1; j <=i-1; j++) { a[i][j] = a[i - 1][j-1] + a[i - 1][j];//每一位上的數(shù)字相當(dāng)于兩肩上的和 } } for (i = 0; i < n; i++) {//遍歷輸出 for (t = i; t < n; t++) { printf(" "); } for (j = 0; j <=i; j++) { printf("%6d", a[i][j]); } printf(" "); } return 0; }
?
Tips
1、編譯器和運(yùn)行環(huán)境都不會(huì)檢查數(shù)組的下標(biāo)是否越界,無論是對(duì)數(shù)組的單元讀還是寫,一旦程序運(yùn)行,越界的數(shù)組訪問就可能造成問題,導(dǎo)致程序崩潰。
2、但有時(shí)候也有可能運(yùn)氣好,不會(huì)造成嚴(yán)重后果。
3、所以這是程序員的責(zé)任來保持程序只使用有效的下標(biāo)值,:[0 -? 數(shù)組的大小減1]
4、數(shù)組可以出現(xiàn)在賦值號(hào)的左邊或右邊,在左邊叫左值,在右邊叫右值
5、如果在定義數(shù)值型數(shù)組時(shí),指定了數(shù)組的長度,并且對(duì)其初始化,凡是未被“初始化”的元素,系統(tǒng)有時(shí)候會(huì)自動(dòng)將它們初始化為零,如果是字符型,則初始化為‘’,如果是指針型,則初始化為NULL,即空指針,不過,最好還是自己初始化好比較好。
4、字符的輸入輸出
有五種輸入:gets(),getchar(),getch ()scanf()? ? ? ? ? fgets()? (文件類)
有五種輸出:puts(),putchar(),putch(),printf()? ? ? ? ? fputs()(文件類
輸入:
1、gets()函數(shù)原形:char * gets(char * ptr);? 用于從標(biāo)準(zhǔn)輸入流stdin讀入一個(gè)整行(以' '或EOF)結(jié)束,并且回車鍵會(huì)被過濾掉,不會(huì)被讀到字符串中,寫入指向的字符數(shù)組,并返回這個(gè)指針;出錯(cuò)或襲遇到文件結(jié)束時(shí)則返回NULL。行末的' '從流中取出,但不寫入數(shù)組。gets()不檢查被寫入的數(shù)組大小。其可以無限讀取,不會(huì)判斷上限,以回車結(jié)束讀取
2、getchar()函數(shù)原形:int getchar(void);? ? 每次只讀入一個(gè)字符,用于從標(biāo)準(zhǔn)輸入流stdin讀入字符,括回車鍵也會(huì)被讀成一個(gè)字符,并返回這個(gè)字符。如果讀到文件結(jié)尾,則返回EOF。注意到EOF不能用char類型表示,所以getchar()函數(shù)返回的是一個(gè)int型的數(shù)。它輸入的字符被存放在sewll的緩沖區(qū)中,直到用戶按回車才會(huì)執(zhí)行,但是如果你輸了多個(gè)字符,以后的getchar()再執(zhí)行時(shí)就會(huì)直接從緩沖區(qū)中讀取了
?
#includei nt main(void) { char n[5] = {0};int a = getchar(n);//第一次多次輸入字符 (使用getchar時(shí)需要定義一個(gè)變量暫時(shí)存放數(shù)據(jù)) int c = getchar(n);//后面這些就是直接從a輸入的哪些被放到緩沖區(qū)的讀取了 int b = getchar(n); printf("%c", a); printf("%c", b); printf("%c", c); //輸入abc char p; // p=getch();//用它不用按回車鍵 p=getchar(); int b = getchar(); int c = getchar(); putchar(p);//輸出abc putchar(b); putchar(c);}
?
3、getch()函數(shù)原形:int getch(void);? 它的功能和getchar基本相同,差別在getch是直接從鍵盤獲取值,不等用戶按鍵,它直接返回用戶輸入的ASCII碼值,出錯(cuò)就返回-1(getchar和getch都可以用來放在程序的末尾,當(dāng)作“暫停鍵”使用,此時(shí)圓括號(hào)不需要參數(shù),按任意鍵繼續(xù))
4、scanf()做為單個(gè)字符輸入時(shí)使用%c數(shù)據(jù)類型符,用于字符串時(shí)使用%s數(shù)據(jù)類型符(注意使用%s時(shí)不用加&)
輸出:
1、puts()函數(shù)原形:int puts(const char *s); 返回值:用來向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)輸出字符串并換行,把字符串輸出到標(biāo)準(zhǔn)輸出設(shè)備,將''轉(zhuǎn)換為回車換行,只能輸出字符串, 不能輸出數(shù)值或進(jìn)行格式變換,可以將字符串直接寫入puts()函數(shù)中:puts("Hello, world!"); ( puts()和gets()都是數(shù)組函數(shù),輸入或輸出前要定義數(shù)組,一個(gè)簡單的輸入后再將輸入的東西輸出)(puts(st);st為數(shù)組名)
2、putchar()函數(shù)原形:int putchar(int char);返回值:該函數(shù)以無符號(hào) char 強(qiáng)制轉(zhuǎn)換為 int 的形式返回寫入的字符,當(dāng)輸出正確的時(shí)候,返回輸出字符轉(zhuǎn)換為的unsigned int (無符號(hào))值,當(dāng)輸出錯(cuò)誤的時(shí)候,返回EOF(End of file)文件結(jié)束符,表達(dá)式可以是字符型或整型,它每次只能輸出一個(gè)字符 如:“putchar('#')”輸出字符“#”(其函數(shù)度原型在stdio.h中)
3、putch()函數(shù)原形:int putch(int ch);返回值:如果輸出成功,函數(shù)返回該字符;否則返回EOF。在當(dāng)前光標(biāo)處向文本屏幕輸出字符ch,然后光標(biāo)自動(dòng)右移一個(gè)字符位置(其函數(shù)原型在頭文件conio.h中 )
使用方式:1、putch('轉(zhuǎn)義字符');2、putch('單個(gè)字符');3、putch(字符變量);
注:需先定義 char 字符變量='單個(gè)字符';
4、printf()做為單個(gè)字符輸出的時(shí)候使用%c數(shù)據(jù)類型說明符,做為字符串輸出時(shí)使用%s數(shù)據(jù)類型說明符
(puts()的輸入和printf的輸出是有一定的區(qū)別的,puts()遇到‘'就終止,而用printf則不會(huì)這樣。)
(printf函數(shù)可輸出各種不同類型的數(shù)據(jù),putchar函數(shù)只能輸出字符數(shù)據(jù),而puts函數(shù)可輸出字符串?dāng)?shù)據(jù)。)
5、單字符數(shù)組
字符數(shù)組是指用來存放字符數(shù)據(jù)的數(shù)組。其定義的一般形式為:char 數(shù)組名[數(shù)據(jù)長度] 。字符數(shù)組用于存放字符或字符串,字符數(shù)組中的一個(gè)元素存放一個(gè)字符,它在內(nèi)存中占用一個(gè)字節(jié)。用來存放字符數(shù)據(jù)的數(shù)組稱為字符數(shù)組。字符數(shù)組中的一個(gè)元素存放一個(gè)字符。定義字符數(shù)組的方法與定義數(shù)值型數(shù)組的方法類似。由于字符型數(shù)據(jù)是以整數(shù)形式(ASCII代碼)存放的,因此也可以用整型數(shù)組來存放字符數(shù)據(jù)。但這時(shí)每個(gè)數(shù)組元素占2個(gè)字節(jié)的內(nèi)存單元,浪費(fèi)存儲(chǔ)空間,它也可以是多維數(shù)組。
初始化:
1、字符數(shù)組的初始化與數(shù)值型數(shù)組初始化沒有本質(zhì)區(qū)別。但它除了可以逐個(gè)給數(shù)組元素賦予字符外,也可以直接用字符串對(duì)其初始化。
2、用字符常量逐個(gè)初始化數(shù)組:char a[5]={'a','b',,'c','d','e',}; 把8個(gè)字符依次分別賦給c[0]~c[4]這5個(gè)元素
3、如果在定義字符數(shù)組時(shí)不進(jìn)行初始化,則數(shù)組中各元素的值是不可預(yù)料的。如果字符個(gè)數(shù)大于數(shù)組長度,則出現(xiàn)語法錯(cuò)誤。如果初值個(gè)數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動(dòng)定為空字符(即'')。如果提供的初值個(gè)數(shù)與預(yù)定的數(shù)組長度相同,在定義時(shí)可以省略數(shù)組長度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定數(shù)組長度
例子:輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞和有多少個(gè)a(大小寫都算),單詞之間用空格分隔開
?
#includeint main(void) { char a[100] = {0}; int sum = 0; gets(a);//字符的輸入函數(shù) int i=0; int t = 0; while(1){ if (a[i] == '') { break; }else if (a[i] == ' ') { sum++; } if (a[i] == 'a' || a[i] == 'A') { t++; } i++; } printf("有%d個(gè)單詞,%d個(gè)a", sum+1, t); return 0; }
?
6、字符串(數(shù)組)
1、C語言中沒有字符串類型,字符串是存放在字符型數(shù)組中。字符反映在現(xiàn)實(shí)中就是文字、符號(hào)、數(shù)字等人用來表達(dá)的字符,反映在編程中字符就是字符類型的變量。C語言中使用ASCII編碼對(duì)字符進(jìn)行編程,編碼后可以用char型變量來表示一個(gè)字符。C語言的字符串就是多個(gè)字符打包在一起共同組成的,字符串在內(nèi)存中其實(shí)就是多個(gè)字節(jié)連續(xù)分布構(gòu)成的
2、字符串通常以串的整體作為操作對(duì)象,以整數(shù)0(‘’也一樣)或NULL結(jié)尾的,‘’ 標(biāo)致著字符串的結(jié)束也是字符串的標(biāo)志,但是計(jì)算長度時(shí)不包括這個(gè)0,這里補(bǔ)充一點(diǎn):字符串在存儲(chǔ)上類似字符數(shù)組,所以它每一位的單個(gè)元素都是可以提取的,如s=“abcdefgij”,則s[1]=“b”,s[9]="j",而字符串的零位正是它的長度,如s[0]=10,這可以給我們提供很多方便,如高精度運(yùn)算時(shí)每一位都可以轉(zhuǎn)化為數(shù)字存入數(shù)組
3、字符串或串(String)是由數(shù)字、字母、下劃線組成的一串字符。一般記為 s=“a1a2···an”(n>=0)。字符(string)是符號(hào)或數(shù)值的一個(gè)連續(xù)序列,如符號(hào)串(一串字符)或二進(jìn)制數(shù)字串(一串二進(jìn)制數(shù)字)。串的兩種最基本的存儲(chǔ)方式是順序存儲(chǔ)方式和鏈接存儲(chǔ)方式。
4、C語言的字符串不能運(yùn)用運(yùn)算符對(duì)其操作,通過數(shù)組的方式可以遍歷字符串,唯一特殊的地方就是字符串字面量可以用來初始化字符數(shù)組,字符串以數(shù)組的形式出現(xiàn),以數(shù)組或指針的形式訪問(更多的時(shí)候是用指針的形式)
C語言標(biāo)準(zhǔn)庫和string.h頭文件里提供了一系列的字符串操作函數(shù)
5、字符串常量:char *s=“Hello world”;? s是一個(gè)指針,初始化指向一個(gè)字符串常量,由于這個(gè)常量所在的地方,所以實(shí)際上s是const 的char *s,但由于歷史的原因,編譯器接受不帶const 的 char *s的寫法,但是如果試圖對(duì)s所指的字符串做寫入有可能會(huì)造成嚴(yán)重后果,所以 如果需要修改字符串,應(yīng)該用數(shù)組,char s[ ] ="Hello world";
" Hello" 會(huì)被編譯器變成一個(gè)字符數(shù)組放在某處,這個(gè)數(shù)組的長度是6,結(jié)尾還會(huì)有個(gè)零表示結(jié)束,兩個(gè)相鄰字符串常量會(huì)被自動(dòng)鏈接起來。
初始化
1、直接用字符數(shù)組的方法初始化:char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};(字符數(shù)組的賦值只能按元素一一賦值)
2、使用輸入字符的輸入函數(shù)進(jìn)行輸入賦值
3、也可以省略花括號(hào) :char str[ ]="I am happy";
Tips
字符串可以代表為char*的形式,但是? char * 不一定是字符串,本意是指向字符的指針,可能指向的是字符的數(shù)組(就像int*一樣) 注意:只有它所指的字符數(shù)組末尾有0,才能說它所指向的是字符串
char *a ="Hello" 和char ?b[ ]="Hello" 的不同,做為數(shù)組的時(shí)候,它是個(gè)常量(這個(gè)字符串在這里 )。? 做為指針,它是個(gè)變量(這個(gè)字符串不知道在哪里) (指針 可以用來處理參數(shù),動(dòng)態(tài)分配空間)所以? :如果要構(gòu)造一個(gè)字符串—>用數(shù)組,如果要處理一個(gè)字符串—>用指針
?
c語言中字符串是通過字符指針來間接實(shí)現(xiàn)的 char *p="linux"; //字符串 char a[]="linux; //字符數(shù)組 printf("p=%s. ",p); printf("a=%s. ",a);
?
字符(串)處理頭文件
1、#include
2、#include
里分別包含有以下這些函數(shù):
strlen求字符串長度
strcmp比較2個(gè)字符串是否一樣
strcat字符串連接操作
strcpy字符串拷貝操作(要求兩個(gè)字符串長度足夠)
strncat字符串連接操作(前n個(gè)字符)
strncpy字符串拷貝操作(前n個(gè)字符)
strchr找一個(gè)字符,查詢?cè)谧址械谝粋€(gè)出現(xiàn)這個(gè)字符的位置
strstr查詢s1是否是s2子串
3、
(使用函數(shù)時(shí)利用返回值來操作)
對(duì)于字符串的操作還有sprintf(把格式化的數(shù)據(jù)寫入某個(gè)字符串中)和sscanf(讀取格式化的字符串中的數(shù)據(jù))這兩個(gè)函數(shù)
?
審核編輯:湯梓紅
評(píng)論
查看更多