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