C 語言入門 慕課網

第一章 初始C程序

C語言一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特點迅速在全世界普及和推廣。C語言不但執行效率高而且可移植性好,可以用來開發應用軟件、驅動、操作系統等。C語言也是其它衆多高級語言的鼻祖語言,所以說學習C語言是進入編程世界的必修課。

簡單來說,一個C程序就是由若干頭文件和函數組成。
這裏寫圖片描述

“#include

良好的變成習慣

在寫C語言程序的時候爲了書寫清晰、便於閱讀、便於理解、便於維護,在編寫程序時應遵循以下規則:
1、一個說明或一個語句佔一行,例如:包含頭文件、一個可執行語句結束都需要換行;
2、函數體內的語句要有明顯縮進,通常以按一下Tab鍵爲一個縮進;
3、括號要成對寫,如果需要刪除的話也要成對刪除;
4、當一句可執行語句結束的時候末尾需要有分號
5、代碼中所有符號均爲英文半角符號

以一個例子來看:
這裏寫圖片描述

註釋

註釋是爲了使別人能看懂你寫的程序,也爲了使你在若干年後還能看得懂你曾經寫的程序而設定的
註釋是寫給程序員看的,不是寫給電腦看的。
所以註釋的內容,C語言編譯器在編譯時會被自動忽略。
C語言註釋方法有兩種:
多行註釋: /* 註釋內容 */
單行註釋: //註釋一行

第二章 C中數據類型

編程時給變量或者函數起的名字就是標識符

C 語言規定,標識符可以是字母(A~Z,a~z)、數字(0~9)、下劃線*_組成的字符串,並且第一個字符必須是字母或下劃線*。

在使用標識符時還有注意以下幾點:
1. 標識符的長度最好不要超過8位,因爲在某些版本的C中規定標識符前8位有效,當兩個標識符前8位相同時,則被認爲是同一個標識符。
2. 標識符是嚴格區分大小寫的。例如Imooc和imooc 是兩個不同的標識符。
3. 標識符最好選擇有意義的英文單詞組成做到”見名知意”,不要使用中文。
4. 標識符不能是C語言的關鍵字。想了解更多C語言關鍵字的知識,請查閱WIKI。

變量及賦值

變量就是可以變化的量,而每個變量都會有一個名字(標識符)。
變量佔據內存中一定的存儲單元。
使用變量之前必須先定義變量,要區分變量名和變量值是兩個不同的概念
變量定義的一般形式爲:數據類型 變量名;
多個類型相同的變量:數據類型 變量名, 變量名, 變量名…;

變量名和標識符的命名規範完全相同。
注意:在定義中不允許連續賦值,如int a=b=c=5;是不合法的。

變量的賦值分爲兩種方式:
1. 先聲明再賦值 int num; num = 10;
2. 聲明的同時賦值 int num = 10;

基本數據類型

C語言中的數據是有類型。
C語言中,數據類型可分爲四大類:
- 基本數據類型
- 構造數據類型
- 指針類型
- 空類型
- 這裏寫圖片描述

基本數據類型中最簡單也是最常用的整型、實型與字符型。
這裏寫圖片描述

整型數據是指不帶小數的數字。
因此整型的類型比較多:
這裏寫圖片描述
注:int、short int、long int是根據編譯環境的不同,所取範圍不同。而其中short int和long int至少是表中所寫範圍,但是int在表中是以16位編譯環境寫的取值範圍。另外 c語言int的取值範圍在於他佔用的字節數 ,不同的編譯器,規定是不一樣。ANSI標準定義int是佔2個字節,TC是按ANSI標準的,它的int是佔2個字節的。但是在VC裏,一個int是佔4個字節的。

浮點數據是指帶小數的數字。
這裏寫圖片描述

注:C語言中不存在字符串變量,字符串只能存在字符數組中,這個後面會講。

格式化輸出語句

格式化輸出語句,也可以說是佔位輸出,是將各種類型的數據按照格式化後的類型及指定的位置從計算機上顯示。
其格式爲:
printf(“輸出格式符”,輸出項);

這裏寫圖片描述

當輸出語句中包含普通字符時,可以採用一下格式:
printf(“普通字符輸出格式符”, 輸出項);

int a = 10;
printf("a = %d",a); //結果爲 a = 10

如果要輸出多個變量的並指定變量的位置時候,格式符還可以連用,變量之間需要用逗號隔開。
注意:格式符的個數要與變量、常量或者表達式的個數一一對應

不可改變的常量

在程序執行過程中,值不發生改變的量稱爲常量。
C語言的常量可以分爲直接常量符號常量
直接常量也稱爲字面量,是可以直接拿來使用,無需說明的量,比如:
- 整型常量:13、0、-13;
- 實型常量:13.33、-24.4;
- 字符常量:‘a’、‘M’

在C語言中,可以用一個標識符來表示一個常量,稱之爲符號常量。
符號常量在使用之前必須先定義,其一般形式爲:
#define 標識符 常量值
符號常量的標示符一般習慣使用大寫字母,變量的標示符一般習慣使用小寫字母,加以區分。

#include <stdio.h>
#defien PI 3.14   //定義一個圓周率常量
int main () {
    printf("圓周率: %f\n",PI);
    return 0;
}

注意:常量是不可改變的

自動類型轉換

數據類型存在自動轉換的情況,比如:

char c = 'a';
int x;
double d;
x = c; //字符類型可以自動轉換爲整型
d = x; //整型可以自動轉換爲浮點類型

自動轉換髮生在不同數據類型運算時,在編譯的時候自動完成。
自動轉換遵循的規則就好比小盒子可以放進大盒子裏面一樣。
注:字節小的可以向字節大的自動轉換,但字節大的不能向字節小的自動轉換

強制類型轉換

強制類型轉換是通過定義類型轉換運算來實現的。其一般形式爲:
(數據類型) (表達式)
其作用是把表達式的運算結果強制轉換成類型說明符所表示的類型;
例如:

double temp1 = 6.777;
int temp2 = (int) temp1; //強制轉換爲int類型
printf("%f\n",temp1);  //輸出 6.777000
printf("%f\n",temp2);  //輸出 6

在使用強制轉換時應注意以下問題:
1. 數據類型和表達式都必須加括號,如把(int)(x/2+y)寫成(int)x/2+y則成了把x轉換成int型之後再除2再與y相加了。
2. 轉換後不會改變原數據的類型及變量值,只在本次運算中臨時性轉換
3. 強制轉換後的運算結果不遵循四捨五入原則

第三章 C中的運算符

運算符

C語言中的運算就是對數據進行操作、處理的過程。
運算符就是指定該運算的處理方式。
那麼C語言中有一下運算符:

  • 算術運算符
  • 賦值運算符
  • 關係運算符
  • 邏輯運算符
  • 三目運算符

算術運算符

C語言基本算術運算符如下表:
這裏寫圖片描述

  • 除法運算中注意:
    • 如果相除的兩個數都是整數的話,則結果也爲整數,小數部分省略,如8/3 = 2;
    • 而兩數中有一個爲小數,結果則爲小數,如:9.0/2 = 4.500000。
  • 取餘運算中注意:
    • 該運算只適合用兩個整數進行取餘運算,如:10%3 = 1;
    • 而10.0%3則是錯誤的;運算後的符號取決於被模數的符號,如(-10)%3 = -1;而10%(-3) = 1。

注:C語言中沒有乘方這個運算符,也不能用×,÷等算術符號。

自增與自減運算符

自增運算符爲“++”,其功能是使變量的值自增1;
自減運算符爲“–”,其功能是使變量值自減1。
自增自減運算符有以下幾種形式:
這裏寫圖片描述

注意:
無論是a++還是++a都等同於a=a+1,在表達式執行完畢後a的值都自增了1,
無論是a–還是–a都等同於a=a-1,在表達式執行完畢後a的值都自減少1。

賦值運算符

C語言中賦值運算符分爲簡單賦值運算符和複合賦值運算符。
簡單賦值運算符“=”號;
複合賦值運算符就是在簡單賦值符“=”之前加上其它運算符構成,例如+=、-=、*=、/=、%=。

a += 5;這個算式就等價於a = a+5; 將變量a和5相加之後再賦值給a
注意:複合運算符中運算符和等號之間是不存在空格的。

關係運算符

C語言中的關係運算符:
這裏寫圖片描述
關係表達式的值是“真”和“假”,在C程序用整數1和0表示。
注意:>=,<=,==,!=這種符號之間不能存在空格

邏輯運算符

C語言中的邏輯運算符:
這裏寫圖片描述

7 < x<100 : x>7 && x<100;

邏輯運算的值也是有兩種分別爲“真”和“假”,
C語言中用整型的1和0來表示。其求值規則如下:

  • 與運算(&&)
    參與運算的兩個變量都爲真時,結果才爲真,否則爲假。例如: 5>=5 && 7>5 ,運算結果爲真;
  • 或運算(||)
    參與運算的兩個變量只要有一個爲真,結果就爲真。 兩個量都爲假時,結果爲假。例如:5>=5||5>8,運算結果爲真;
  • 非運算(!)
    參與運算的變量爲真時,結果爲假;參與運算量爲假時,結果爲真。例如:!(5>8),運算結果爲真。

三目運算符

C語言中的三目運算符:“? :”,其格式爲:
表達式1 ? 表達式2 : 表達式3;
執行過程是:
先判斷表達式1的值是否爲真,如果是真的話執行表達式2;如果是假的話執行表達式3。

運算符大優先級比較

優先級就是在運算中運算的先後順序。
這裏寫圖片描述

優先級別爲1的優先級最高,優先級別爲10的優先級別最低.

C程序結構語句

C語言中的分支結構語句中的if語句。

if(表達式1) {
    執行代碼塊1;
} else if(表達式2){
    執行代碼塊2;
}
 ...
else {
    執行代碼塊n;
}

依次判斷表達式的值,當出現某個值爲真時,則執行對應代碼塊,否則執行代碼塊n
注意:if()後面沒有分號,直接寫{}

嵌套if-else語句

if(表達式) {
    if(表達式) {
      //
    } else (表達式) {
      //
    }
} else (表達式) {
    if(表達式) {
      //
    } else (表達式) {
      //
    }
}

循環結構

反覆不停的執行某個動作稱之謂循環
C語言中有三種循環結構

循環結構之while循環

while(表達式) {
    執行代碼塊
}

使用while語句應注意以下幾點:

  1. while語句中的表達式一般是關係表達或邏輯表達式,當表達式的值爲假時不執行循環體,反之則循環體一直執行。
  2. 一定要記着在循環體中改變循環變量的值,否則會出現死循環(無休止的執行)。
  3. 循環體如果包括有一個以上的語句,則必須用{}括起來,組成複合語句。

循環結構之do-while循環

do-while循環語句的語義是:它先執行循環中的執行代碼塊,然後再判斷while中表達式是否爲真,如果爲真則繼續循環;如果爲假,則終止循環。因此,do-while循環至少要執行一次循環語句。

do {
    執行代碼塊
} while(表達式); //注意這裏有分號

注意:使用do-while結構語句時,while括號後必須有分號。

循環結構之for循環

更直接、簡單、靈活的循環。

for(表達式1; 表達式2; 表達式3) {
    執行代碼塊
}

在for循環中,
表達式1是一個或多個賦值語句,它用來控制變量的初始值
表達式2是一個關係表達式,它決定什麼時候退出循環
表達式3是循環變量的步進值,定義控制循環變量每循環一次後按什麼方式變化。
這三部分之間用分號(;)分開

它的執行過程如下:
第一步:執行表達式1,對循環變量做初始化;
第二步:判斷表達式2,若其值爲真(非0),則執行for循環體中執行代碼塊,然後向下執行;若其值爲假(0),則結束循環;
第三步:執行表達式3;
第四步:執行for循環中執行代碼塊後執行第二步;
第五步:循環結束,程序繼續向下執行。

注意:
- for循環中的分號一定要寫
- for循環中的“表達式1、2、3”均可可以缺省,但分號(;)不能缺省。
- 省略“表達式1(循環變量賦初值)”,表示不對循環變量賦初始值。
- 省略“表達式2(循環條件)”,不做其它處理,循環一直執行(死循環)
- 省略“表達式3(循環變量增量)“,不做其他處理,循環一直執行(死循環)
- 死循環可以使用後面即將講到的break解決
- 表達式1可以是設置循環變量的初值的賦值表達式,也可以是其他表達式
- 表達式1和表達式3可以是一個簡單表達式也可以是多個表達式以逗號分割。
- 表達式2一般是關係表達式或邏輯表達式,但也可是數值表達式或字符表達式,只要其值非零,就執行循環體
- 各表達式中的變量一定要在for循環之前定義
這裏寫圖片描述

三種循環的比較

while、do-while和for三種循環在具體的使用場合上是有區別的,如下:
1、在知道循環次數的情況下更適合使用for循環;
2、在不知道循環次數的情況下適合使用while或者do-while循環,如果有可能一次都不循環應考慮使用while循環,如果至少循環一次應考慮使用do-while循環。
但是從本質上講,while,do-while和for循環之間是可以相互轉換的

循環結構之多重循環

在功能需求上,往往一個循環滿足不了
多重循環就是在循環結構的循環體中又出現循環結構。
在實際開發中一般最多用到三層重循環。因爲循環層數越多,運行時間越長,程序越複雜,所以一般用2-3層多重循環就可以了。
另外不同循環之間也是可以嵌套的。

多重循環在執行的過程中,外層循環爲父循環,內層循環爲子循環,
父循環一次,子循環需要全部執行完,直到跳出循環。
父循環再進入下一次,子循環繼續執行…

注:一個父循環可以有多個子循環

結束語句之break語句

由於某中原因需要中斷當前的事情,並且不能繼續進行下去
可以使用break語句中斷,不再繼續
使用break語句時注意以下幾點:
1、在沒有循環結構的情況下,break不能用在單獨的if-else語句中。
2、在多層循環中,一個break語句只跳出當前循環。

結束語句之continue語句

由於某中原因需要中斷當前的事情,過一會還能繼續進行
可以使用continue語句進行中斷後繼續

continue語句的作用是結束本次循環開始執行下一次循環。
break語句與continue語句的區別是:
break是跳出當前整個循環,
continue結束本次循環開始下一次循環。
break不僅能用在循環體內,還有下面的switch語句。
continue只能用在循環體內

分支結構之switch語句

分支結構之switch語句
switch 語法結構

在使用switch語句時還應注意以下幾點:
1、在case後的各常量表達式的值不能相同,否則會出現錯誤。
2、在case子句後如果沒有break;會一直往後執行一直到遇到break;纔會跳出switch語句。
3、switch後面的表達式語句只能是整型或者字符類型。
4、在case後,允許有多個語句,可以不用{}括起來。
5、各case和default子句的先後順序可以變動,而不會影響程序執行結果。
6、default子句可以省略不用。

臭名遠揚之goto語句

goto語句是一種無條件分支語句,goto 語句的使用格式爲:
goto 語句標號;
其中語句標號是一個標識符,該標識符一般用英文大寫並遵守標識符命名規則,這個標識符加上一個“:”一起出現在函數內某處,執行goto語句後,程序將跳轉到該標號處並執行其後的語句。

第五章 函數的祕密

自定義函數

C語言提供了大量的庫函數,比如stdio.h提供輸出函數,
但是還是滿足不了我們開發中的一些邏輯,所以這個時候需要自己定義函數,自定義函數的一般形式:

[] 函數名稱([]) 
{
    執行代碼塊;
    return (表達式);
}

注意:
1、[]包含的內容可以省略,數據類型說明省略,默認是int類型函數;參數省略表示該函數是無參函數,參數不省略表示該函數是有參函數;
2、函數名稱遵循標識符命名規範;
3、自定義函數儘量放在main函數之前,如果要放在main函數後面的話,需要在main函數之前先聲明自定義函數,
聲明格式爲:[數據類型說明] 函數名稱([參數]);

函數調用

自定義的函數不是放在程序中擺着看的,我們需要用到自定義的函數的時候,就得調用它,那麼在調用的時候就稱之爲函數調用。
在C語言中,函數調用的一般形式爲:
函數名([參數]);
注意:
1、對無參函數調用的時候可以將[]包含的省略。
2、[]中可以是常數,變量或其它構造類型數據及表達式,個參數之間用逗號分隔。

在函數中不需要函數參數的稱之爲無參函數,
在函數中需要函數參數的稱之爲有參函數。
有參函數和無參函數的唯一區別在於:函數()中多了一個參數列表。

有參函數更爲靈活

形參與實參

函數的參數分爲形參實參兩種,
形參是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳如的參數;
實參是在調用時傳遞該函數的參數。

函數的形參和實參具有以下特點:
- 形參只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。函數調用結束返回主調函數後則不能再使用該形參變量。
- 實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值等辦法使實參獲得確定值。
- 在參數傳遞時,實參和形參在數量上,類型上,順序上應嚴格一致,否則會發生類型不匹配”的錯誤。

函數的返回值

函數的返回值是指函數被調用之後,執行函數體中的程序段所取得的並返回給主調函數的值。

函數的返回值要注意以下幾點:
1. 函數的值只能通過return語句返回主調函數。return語句的一般形式爲:
return 表達式 或者爲: return (表達式);
2. 函數值的類型和函數定義中函數的類型應保持一致。如果兩者不一致,則以函數返回類型爲準,自動進行類型轉換。
3. 沒有返回值的函數,返回類型爲void。
4. 注意:void函數中可以有執行代碼塊,但是不能有返回值,另void函數中如果有return語句,該語句只能起到結束函數運行的功能。其格式爲:
return;

用戶定義的函數中可以沒有return語句

遞歸函數

遞歸就是一個函數在它的函數體內調用它自身
執行遞歸函數將反覆調用其自身,每調用一次就進入新的一層。

注意:遞歸函數必須有結束條件。

遞歸函數特點:
- 每一級函數調用時都有自己的變量,但是函數代碼並不會得到複製;
- 每次調用都會有一次返回;
- 遞歸函數中,位於遞歸調用前的語句和各級被調用函數具有相同的執行順序
- 遞歸函數中,位於遞歸調用後的語句的執行順序和各被調用函數的順序相反;
- 遞歸函數中必須有終止語句。

一句話總結遞歸:自我調用且有完成狀態。

局部與全局

C語言中的變量,按作用域範圍可分爲兩種,即局部變量和全局變量。

  • 局部變量也稱爲內部變量。
    • 局部變量是在函數內作定義說明的。
    • 其作用域僅限於函數內, 離開該函數後再使用這種變量是非法的。
    • 在複合語句中也可定義變量,其作用域只在複合語句範圍內。
  • 全局變量也稱爲外部變量
    • 它是在函數外部定義的變量。
    • 它不屬於哪一個函數,它屬於一個源程序文件。

變量存儲類別

C語言根據變量的生存週期來劃分,
可以分爲靜態存儲方式動態存儲方式

  • 靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。
    靜態存儲區中存放了在整個程序執行過程中都存在的變量,如全局變量。

  • 動態存儲方式:是指在程序運行期間根據需要進行動態的分配存儲空間的方式。
    動態存儲區中存放的變量是根據程序運行的需要而建立和釋放的,
    通常包括

    • 函數形式參數;
    • 自動變量;
    • 函數調用時的現場保護
    • 返回地址等。

C語言中存儲類別又分爲四類:
- 自動(auto)
- 靜態(static)
- 寄存器的(register)
- 外部的(extern)。

1、用關鍵字auto定義的變量爲自動變量,auto可以省略,
auto不寫則隱含定爲“自動存儲類別”,屬於動態存儲方式。
2、用static修飾的爲靜態變量,如果定義在函數內部的,稱之爲靜態局部變量;如果定義在函數外部,稱之爲靜態外部變量。
注意:靜態局部變量屬於靜態存儲類別,在靜態存儲區內分配存儲單元,在程序整個運行期間都不釋放;靜態局部變量在編譯時賦初值,即只賦初值一次;如果在定義局部變量時不賦初值的話,則對靜態局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。
3、爲了提高效率,C語言允許將局部變量得值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關鍵字register作聲明。
注意:只有局部自動變量和形式參數可以作爲寄存器變量;一個計算機系統中的寄存器數目有限,不能定義任意多個寄存器變量;
局部靜態變量不能定義爲寄存器變量。
4、用extern聲明的的變量是外部變量,外部變量的意義是某函數可以調用在該函數之後定義的變量。

內部函數與外部函數

  • C語言中不能被其他源文件調用的函數稱謂內部函數 ,內部函數由static關鍵字來定義,因此又被稱謂靜態函數,形式爲:
    static [數據類型] 函數名([參數])
    這裏的static是對函數的作用範圍的一個限定,限定該函數只能在其所處的源文件中使用,因此在不同文件中出現相同的函數名稱的內部函數是沒有問題的。

  • 在C語言中能被其他源文件調用的函數稱謂外部函數 ,外部函數由extern關鍵字來定義,形式爲:
    extern [數據類型] 函數名([參數])
    C語言規定,在沒有指定函數的作用範圍時,系統會默認認爲是外部函數,因此當需要定義外部函數時extern也可以省略。

第六章 數組

數組:在程序中是一塊連續的,大小固定並且裏面的數據類型一致的內存空間。
聲明一個數組:
數據類型 數組名稱[長度];

C語言中的數組初始化是有三種形式的,分別是:
1、 數據類型 數組名稱[長度n] = {元素1,元素2…元素n};
2、 數據類型 數組名稱[] = {元素1,元素2…元素n};
3、 數據類型 數組名稱[長度n]; 數組名稱[0] = 元素1; 數組名稱[1] = 元素2; 數組名稱[n] = 元素n;

獲取數組元素時: 數組名稱[元素所對應下標];

注意:
1、數組的下標均以0開始;
2、數組在初始化的時候,數組內元素的個數不能大於聲明的數組長度;
3、如果採用第一種初始化方式,元素個數小於數組的長度時,多餘的數組元素初始化爲0;
4、在聲明數組後沒有進行初始化的時候,靜態(static)和外部(extern)類型的數組元素初始化元素爲0,自動(auto)類型的數組的元素初始化值不確定。

數組的遍歷

數組可以採用循環的方式將每個元素遍歷出來,
而不用人爲的每次獲取指定某個位置上的元素

數組遍歷時要注意以下幾點:
1、最好避免出現數組越界訪問,循環變量最好不要超出數組的長度
2、C語言的數組長度一經聲明,長度就是固定,無法改變,並且C語言並不提供計算數組長度的方法。
由於C語言是沒有檢查數組長度改變或者數組越界的這個機制,可能會在編輯器中編譯並通過,但是結果就不能肯定了,因此還是不要越界或者改變數組的長度

數組作爲函數參數

變量可以當作參數,數組也是可以當做函數的參數。
數組可以由整個數組當作函數的參數,也可以由數組中的某個元素當作函數的參數:
1、整個數組當作函數參數,即把數組名稱傳入函數中
這裏寫圖片描述
2、數組中的元素當作函數參數,即把數組中的參數傳入函數中

數組作爲函數參數時注意以下事項:
1、數組名作爲函數實參傳遞時,函數定義處作爲接收參數的數組類型形參既可以指定長度也可以不指定長度。
2、數組元素作爲函數實參傳遞時,數組元素類型必須與形參數據類型一致。

數組的應用

  • 排序
    • 冒泡排序: 相鄰元素兩兩比較,將較大的數字放在後面,直到將所有數字全部排序
  • 查找:遍歷數組看看是否存在該數據,如果存在並返回該元素的下標

字符串與數組

字符串就是由多個字符組合而成的一段話。
在C語言中,是沒有辦法直接定義字符串數據類型的,但是我們可以使用數組來定義我們所要的字符串。一般有以下兩種格式:
1、char 字符串名稱[長度] = “字符串值”;
2、char 字符串名稱[長度] = {‘字符1’,’字符2’,…,’字符n’,’\0’};
注意:
1、[]中的長度是可以省略不寫的;
2、採用第2種方式的時候最後一個元素必須是’\0’,’\0’表示字符串的結束標誌;
3、採用第2種方式的時候在數組中不能寫中文。

在輸出字符串的時候要使用:printf(“%s”,字符數組名字);或者puts(字符數組名字);。

字符串函數

常用的字符串函數如下:
這裏寫圖片描述

  1. strlen()獲取字符串的長度,在字符串長度中是不包括‘\0’而且漢字和字母的長度是不一樣的。比如:
char str1[] = "慕課網";
chat str2[] = {'i','m','o','o','c','\0'};
printf("%d\n",strlen(str1)); //9 
printf("%d\n",strlen(str2)); //5
  1. strcmp()在比較的時候會把字符串先轉換成ASCII碼再進行比較,返回的結果爲0表示s1和s2的ASCII碼相等,返回結果爲1表示s1比s2的ASCII碼大,返回結果爲-1表示s1比s2的ASCII碼小
  2. strcpy()拷貝之後會覆蓋原來字符串且不能對字符串常量進行拷貝
#include<stdio.h>
#include<string.h>
#define PI "imooc"
int main() {
    char str[] = "愛慕課"; 
    strcpy(str,"I lova imooc");
    printf("$s\n",str);
    //如果對字符串常量進行拷貝,程序沒有運行結果
    //strcpy(PI,"I love imooc");
    //printf("%s\n",PI);
    return 0;
  1. strcat在使用時s1與s2指的內存空間不能重疊,且s1要有足夠的空間來容納要複製的字符串

多維數組

多維數組的定義格式是:
數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n];

多維數組的初始化與一維數組的初始化類似也是分兩種:
1、數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n] = {{值1,..,值n},{值1,..,值n},…,{值1,..,值n}};
2、數據類型 數組名稱[常量表達式1][常量表達式2]…[常量表達式n]; 數組名稱[下標1][下標2]…[下標n] = 值;

多維數組初始化要注意以下事項:
1. 採用第一種始化時數組聲明必須指定列的維數。因爲系統會根據數組中元素的總個數來分配空間,當知道元素總個數以及列的維數後,會直接計算出行的維數;
2. 採用第二種初始化時數組聲明必須同時指定行和列的維數

多維數組的遍歷

多維數組也是存在遍歷的,和一維數組遍歷一樣,也是需要用到循環。不一樣的就是多維數組需要採用嵌套循環

注意:多維數組的每一維下標均不能越界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章