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、數組的初始化可以是用循環進行輸入數值賦值,也可以是在程序中指定賦值
例子:
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 個字節二維數組隻是形式上的二維,但是在計算機内部它的存儲方式還是連續的線性的。它隻是一種特殊的一維數組。
二維數組的定義和一維數組的概念規則基本相似,一般形式為:類型說明符 數組名【常量表達式】【常量表達式】。
初始化稍有不同
注意,二維數組的列數是必須要給出的,行數是可以有編譯器來數。
每行一個{},逗号分離
最後的的逗号可以存在(有古老的傳統)
如果省略,表示補零
例子:楊輝三角
Tips
1、編譯器和運行環境都不會檢查數組的下标是否越界,無論是對數組的單元讀還是寫,一旦程序運行,越界的數組訪問就可能造成問題,導緻程序崩潰。
2、但有時候也有可能運氣好,不會造成嚴重後果。
3、所以這是程序員的責任來保持程序隻使用有效的下标值,:[0 - 數組的大小減1]
4、數組可以出現在賦值号的左邊或右邊,在左邊叫左值,在右邊叫右值
5、如果在定義數值型數組時,指定了數組的長度,并且對其初始化,凡是未被“初始化”的元素,系統有時候會自動将它們初始化為零,如果是字符型,則初始化為‘\0’,如果是指針型,則初始化為NULL,即空指針,不過,最好還是自己初始化好比較好。
4、字符的輸入輸出有五種輸入:gets(),getchar(),getch ()scanf() fgets() (文件類)
有五種輸出:puts(),putchar(),putch(),printf() fputs()(文件類
輸入:
1、gets()函數原形:char * gets(char * ptr); 用于從标準輸入流stdin讀入一個整行(以'\n'或EOF)結束,并且回車鍵會被過濾掉,不會被讀到字符串中,寫入指向的字符數組,并返回這個指針;出錯或襲遇到文件結束時則返回NULL。行末的'\n'從流中取出,但不寫入數組。gets()不檢查被寫入的數組大小。其可以無限讀取,不會判斷上限,以回車結束讀取
2、getchar()函數原形:int getchar(void); 每次隻讀入一個字符,用于從标準輸入流stdin讀入字符,括回車鍵也會被讀成一個字符,并返回這個字符。如果讀到文件結尾,則返回EOF。注意到EOF不能用char類型表示,所以getchar()函數返回的是一個int型的數。它輸入的字符被存放在sewll的緩沖區中,直到用戶按回車才會執行,但是如果你輸了多個字符,以後的getchar()再執行時就會直接從緩沖區中讀取了
3、getch()函數原形:int getch(void); 它的功能和getchar基本相同,差别在getch是直接從鍵盤獲取值,不等用戶按鍵,它直接返回用戶輸入的ASCII碼值,出錯就返回-1(getchar和getch都可以用來放在程序的末尾,當作“暫停鍵”使用,此時圓括号不需要參數,按任意鍵繼續)
4、scanf()做為單個字符輸入時使用%c數據類型符,用于字符串時使用%s數據類型符(注意使用%s時不用加&)
輸出:
1、puts()函數原形:int puts(const char *s); 返回值:用來向标準輸出設備(屏幕)輸出字符串并換行,把字符串輸出到标準輸出設備,将'\0'轉換為回車換行,隻能輸出字符串, 不能輸出數值或進行格式變換,可以将字符串直接寫入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()遇到‘\0'就終止,而用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、如果在定義字符數組時不進行初始化,則數組中各元素的值是不可預料的。如果字符個數大于數組長度,則出現語法錯誤。如果初值個數小于數組長度,則隻将這些字符賦給數組中前面那些元素,其餘的元素自動定為空字符(即'\0')。如果提供的初值個數與預定的數組長度相同,在定義時可以省略數組長度,系統會自動根據初值個數确定數組長度
例子:輸入一行字符,統計其中有多少個單詞和有多少個a(大小寫都算),單詞之間用空格分隔開
6、字符串(數組)
1、C語言中沒有字符串類型,字符串是存放在字符型數組中。字符反映在現實中就是文字、符号、數字等人用來表達的字符,反映在編程中字符就是字符類型的變量。C語言中使用ASCII編碼對字符進行編程,編碼後可以用char型變量來表示一個字符。C語言的字符串就是多個字符打包在一起共同組成的,字符串在内存中其實就是多個字節連續分布構成的
2、字符串通常以串的整體作為操作對象,以整數0(‘\0’也一樣)或NULL結尾的,‘\0’ 标緻着字符串的結束也是字符串的标志,但是計算長度時不包括這個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" 的不同,做為數組的時候,它是個常量(這個字符串在這裡 )。 做為指針,它是個變量(這個字符串不知道在哪裡) (指針 可以用來處理參數,動态分配空間)所以 :如果要構造一個字符串—>用數組,如果要處理一個字符串—>用指針
字符(串)處理頭文件
1、#include <string.h> //字符串處理
2、#include <ctype.h> //字符處理
裡分别包含有以下這些函數:
strlen求字符串長度
strcmp比較2個字符串是否一樣
strcat字符串連接操作
strcpy字符串拷貝操作(要求兩個字符串長度足夠)
strncat字符串連接操作(前n個字符)
strncpy字符串拷貝操作(前n個字符)
strchr找一個字符,查詢在字符串中第一個出現這個字符的位置
strstr查詢s1是否是s2子串
3、<ctype.h>裡分别包含以下這些函數:
(使用函數時利用返回值來操作)
對于字符串的操作還有sprintf(把格式化的數據寫入某個字符串中)和sscanf(讀取格式化的字符串中的數據)這兩個函數
作者:Mr_Li_
對啦對啦!另外的話為了幫助大家,輕松,高效學習C語言/C ,我給大家分享我收集的資源,從最零基礎開始的教程到C語言項目案例,幫助大家在學習C語言的道路上披荊斬棘!可以來我粉絲群領取哦~
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)最重要的是你可以在群裡面交流提問編程問題哦!
對于C/C 感興趣可以關注小編在後台私信我:【編程交流】一起來學習哦!可以領取一些C/C 的項目學習視頻資料哦!已經設置好了關鍵詞自動回複,自動領取就好了!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!