#include
int main()
{
/*在雙引號(hào)中間輸入Hello World*/
printf("HelloWorld");//在屏幕打印輸出Hello World
return 0;
}
注:在最新的C標(biāo)準(zhǔn)中,main函數(shù)前的類(lèi)型為int而不是void
C語(yǔ)言的具體結(jié)構(gòu)
簡(jiǎn)單來(lái)說(shuō),一個(gè)C程序就是由若干頭文件和函數(shù)組成。
#include
函數(shù)就是實(shí)現(xiàn)代碼邏輯的一個(gè)小的單元。
必不可少之主函數(shù)
一個(gè)C程序有且只有一個(gè)主函數(shù),即main函數(shù)。
-
C程序就是執(zhí)行主函數(shù)里的代碼,也可以說(shuō)這個(gè)主函數(shù)就是C語(yǔ)言中的唯一入口
-
而main前面的int就是主函數(shù)的類(lèi)型
-
printf()是格式輸出函數(shù),這里就記住它的功能就是在屏幕上輸出指定的信息
-
return是函數(shù)的返回值,根據(jù)函數(shù)類(lèi)型的不同,返回的值也是不同的
-
是轉(zhuǎn)義字符中的換行符。(注意:C程序一定是從主函數(shù)開(kāi)始執(zhí)行的)
寫(xiě)代碼的良好習(xí)慣
-
一個(gè)說(shuō)明或一個(gè)語(yǔ)句占一行,例如:包含頭文件、一個(gè)可執(zhí)行語(yǔ)句結(jié)束都需要換行
-
函數(shù)體內(nèi)的語(yǔ)句要有明顯縮進(jìn),通常以按一下Tab鍵為一個(gè)縮進(jìn)
-
括號(hào)要成對(duì)寫(xiě),如果需要?jiǎng)h除的話也要成對(duì)刪除
-
當(dāng)一句可執(zhí)行語(yǔ)句結(jié)束的時(shí)候末尾需要有分號(hào)
-
代碼中所有符號(hào)均為英文半角符號(hào)
程序解釋——注釋
注釋是寫(xiě)給程序員看的,不是寫(xiě)給電腦看的。
C語(yǔ)言注釋方法有兩種:
多行注釋?zhuān)?*注釋內(nèi)容*/
單行注釋?zhuān)?/注釋一行
C標(biāo)識(shí)符
C語(yǔ)言規(guī)定,標(biāo)識(shí)符可以是字母(A~Z,a~z)、數(shù)字(0~9)、下劃線_組成的字符串,并且第一個(gè)字符必須是字母或下劃線。在使用標(biāo)識(shí)符時(shí)還有注意以下幾點(diǎn):
-
標(biāo)識(shí)符的長(zhǎng)度最好不要超過(guò)8位,因?yàn)樵谀承┌姹镜腃中規(guī)定標(biāo)識(shí)符前8位有效,當(dāng)兩個(gè)標(biāo)識(shí)符前8位相同時(shí),則被認(rèn)為是同一個(gè)標(biāo)識(shí)符
-
標(biāo)識(shí)符是嚴(yán)格區(qū)分大小寫(xiě)的。例如Imooc和imooc 是兩個(gè)不同的標(biāo)識(shí)符
-
標(biāo)識(shí)符最好選擇有意義的英文單詞組成做到"見(jiàn)名知意",不要使用中文
-
標(biāo)識(shí)符不能是C語(yǔ)言的關(guān)鍵字。想了解更多C語(yǔ)言關(guān)鍵字的知識(shí)
變量定義與賦值
變量就是可以變化的量,而每個(gè)變量都會(huì)有一個(gè)名字(標(biāo)識(shí)符)。變量占據(jù)內(nèi)存中一定的存儲(chǔ)單元。使用變量之前必須先定義變量,要區(qū)分變量名和變量值是兩個(gè)不同的概念。
變量定義與賦值的一般形式如下。
注意:在定義中不允許連續(xù)賦值,如下操作是不合法的。
int a=b=c=5; //不合法的賦值操作
變量的賦值分為兩種方式:
-
先聲明再賦值
-
聲明的同時(shí)賦值
基本數(shù)據(jù)類(lèi)型
C語(yǔ)言中的數(shù)據(jù)類(lèi)型如下圖所示。
最常用的整型、實(shí)型與字符型(char,int,float,double):
整型數(shù)據(jù)是指不帶小數(shù)的數(shù)字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):
注意:
-
int short int long int是根據(jù)編譯環(huán)境的不同,所取范圍不同
-
而其中short int和long int至少是表中所寫(xiě)范圍, 但是int在表中是以16位編譯環(huán)境寫(xiě)的取值范圍
-
另外 c語(yǔ)言int的取值范圍在于他占用的字節(jié)數(shù) ,不同的編譯器,規(guī)定是不一樣
-
ANSI標(biāo)準(zhǔn)定義int是占2個(gè)字節(jié),TC是按ANSI標(biāo)準(zhǔn)的,它的int是占2個(gè)字節(jié)的。但是在VC里,一個(gè)int是占4個(gè)字節(jié)的
浮點(diǎn)數(shù)據(jù)是指帶小數(shù)的數(shù)字。
生活中有很多信息適合使用浮點(diǎn)型數(shù)據(jù)來(lái)表示,比如:人的體重(單位:公斤)、商品價(jià)格、圓周率等等。
因?yàn)榫鹊牟煌址譃?種(float,double,long double):
格式化輸出語(yǔ)句
格式化輸出語(yǔ)句,也可以說(shuō)是占位輸出,是將各種類(lèi)型的數(shù)據(jù)按照格式化后的類(lèi)型及指定的位置從計(jì)算機(jī)上顯示。其格式為:
printf("輸出格式符",輸出項(xiàng));
當(dāng)輸出語(yǔ)句中包含普通字符時(shí),可以采用一下格式:
printf("普通字符輸出格式符", 輸出項(xiàng));
注意:格式符的個(gè)數(shù)要與變量、常量或者表達(dá)式的個(gè)數(shù)相對(duì)應(yīng)。
不可改變的常量
在程序執(zhí)行過(guò)程中,值不發(fā)生改變的量稱(chēng)為常量,比如:
在C語(yǔ)言中,可以用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量,常量在使用之前必須先定義,其一般形式為:
#include
#define POCKETMONEY 10 //定義常量及常量值
int main()
{
// POCKETMONEY = 12; //小明私自增加零花錢(qián)對(duì)嗎?
printf("小明今天又得到%d元零花錢(qián) ", POCKETMONEY);
return 0;
}
符號(hào)常量不可以被改變。
自動(dòng)類(lèi)型轉(zhuǎn)換
數(shù)據(jù)類(lèi)型存在自動(dòng)轉(zhuǎn)換的情況。
自動(dòng)轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類(lèi)型運(yùn)算時(shí),在編譯的時(shí)候自動(dòng)完成。
char類(lèi)型數(shù)據(jù)轉(zhuǎn)換為int類(lèi)型數(shù)據(jù)遵循ASCII碼中的對(duì)應(yīng)值。
注意:
-
字節(jié)小的可以向字節(jié)大的自動(dòng)轉(zhuǎn)換,但字節(jié)大的不能向字節(jié)小的自動(dòng)轉(zhuǎn)換
-
char可以轉(zhuǎn)換為int,int可以轉(zhuǎn)換為double,char可以轉(zhuǎn)換為double
強(qiáng)制類(lèi)型轉(zhuǎn)換
強(qiáng)制類(lèi)型轉(zhuǎn)換是通過(guò)定義類(lèi)型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的。其一般形式為:
(數(shù)據(jù)類(lèi)型) (表達(dá)式)
其作用是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類(lèi)型說(shuō)明符所表示的類(lèi)型。在使用強(qiáng)制轉(zhuǎn)換時(shí)應(yīng)注意以下問(wèn)題:
-
數(shù)據(jù)類(lèi)型和表達(dá)式都必須加括號(hào), 如把(int)(x/2+y)寫(xiě)成(int)x/2+y則成了把x轉(zhuǎn)換成int型之后再除2再與y相加了
-
轉(zhuǎn)換后不會(huì)改變?cè)瓟?shù)據(jù)的類(lèi)型及變量值,只在本次運(yùn)算中臨時(shí)性轉(zhuǎn)換
-
強(qiáng)制轉(zhuǎn)換后的運(yùn)算結(jié)果不遵循四舍五入原則
C語(yǔ)言基本運(yùn)算符
除法運(yùn)算中注意:
-
如果相除的兩個(gè)數(shù)都是整數(shù)的話,則結(jié)果也為整數(shù),小數(shù)部分省略,如8/3 = 2
-
而兩數(shù)中有一個(gè)為小數(shù),結(jié)果則為小數(shù),如:9.0/2 = 4.500000
取余運(yùn)算中注意:
-
該運(yùn)算只適合用兩個(gè)整數(shù)進(jìn)行取余運(yùn)算,如:10%3 = 1
-
運(yùn)算后的符號(hào)取決于被模數(shù)的符號(hào),如(-10)%3 = -1,而10%(-3) = 1
自增與自減運(yùn)算符
自增運(yùn)算符為++,其功能是使變量的值自增1。
自減運(yùn)算符為--,其功能是使變量值自減1。
它們經(jīng)常使用在循環(huán)中,自增自減運(yùn)算符有以下幾種形式:
賦值運(yùn)算符
C語(yǔ)言中賦值運(yùn)算符分為簡(jiǎn)單賦值運(yùn)算符和復(fù)合賦值運(yùn)算符。
例如:
a=3; //變量a并賦值為3
a+=5; //這個(gè)算式就等價(jià)于a=a+5,將變量a和5相加之后再賦值給a
注意:復(fù)合運(yùn)算符中運(yùn)算符和等號(hào)之間是不存在空格的。
關(guān)系運(yùn)算符
C語(yǔ)言中的關(guān)系運(yùn)算符:
關(guān)系表達(dá)式的值是真和假,在C程序中用整數(shù)1和0表示。
注意:>=, <=, ==, !=這種符號(hào)之間不能存在空格。
邏輯運(yùn)算符
C語(yǔ)言中的邏輯運(yùn)算符:
邏輯運(yùn)算的值也是有兩種分別為真和假,C語(yǔ)言中用整型的1和0來(lái)表示。其求值規(guī)則如下:
-
與運(yùn)算 &&
參與運(yùn)算的兩個(gè)變量都為真時(shí),結(jié)果才為真,否則為假。例如:5>=5 && 7>5 ,運(yùn)算結(jié)果為真。
-
或運(yùn)算 ||
參與運(yùn)算的兩個(gè)變量只要有一個(gè)為真,結(jié)果就為真。兩個(gè)量都為假時(shí),結(jié)果為假。例如:5>=5||5>8,運(yùn)算結(jié)果為真
-
非運(yùn)算!
參與運(yùn)算的變量為真時(shí),結(jié)果為假;參與運(yùn)算量為假時(shí),結(jié)果為真。例如:!(5>8),運(yùn)算結(jié)果為真
三目運(yùn)算符
C語(yǔ)言中的三目運(yùn)算符,其格式為:
表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3;
程序執(zhí)行過(guò)程是:
判斷表達(dá)式1的值是否為真,如果是真的話執(zhí)行表達(dá)式2,如果是假的話執(zhí)行表達(dá)式3。
運(yùn)算符大比拼之優(yōu)先級(jí)比較
各種運(yùn)算符號(hào)的順序:
優(yōu)先級(jí)別為1的優(yōu)先級(jí)最高,優(yōu)先級(jí)別為10的優(yōu)先級(jí)別最低。
分支結(jié)構(gòu)之簡(jiǎn)單if語(yǔ)句
C語(yǔ)言中的分支結(jié)構(gòu)語(yǔ)句中的if條件語(yǔ)句。
簡(jiǎn)單if語(yǔ)句的基本結(jié)構(gòu)如下:
if(表達(dá)式)
{
執(zhí)行代碼塊;
}
其語(yǔ)義是:如果表達(dá)式的值為真,則執(zhí)行其后的語(yǔ)句,否則不執(zhí)行該語(yǔ)句。
注意:if()后面沒(méi)有分號(hào),直接寫(xiě){}。
分支結(jié)構(gòu)之簡(jiǎn)單if-else語(yǔ)句
簡(jiǎn)單的if-else語(yǔ)句的基本結(jié)構(gòu):
語(yǔ)義是: 如果表達(dá)式的值為真,則執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。
注意:if()后面沒(méi)有分號(hào),直接寫(xiě){},else后面也沒(méi)有分號(hào),直接寫(xiě){}。
分支結(jié)構(gòu)之多重if-else語(yǔ)句
C語(yǔ)言中多重if-else語(yǔ)句,其結(jié)構(gòu)如下:
語(yǔ)義是:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行對(duì)應(yīng)代碼塊,否則執(zhí)行代碼塊n。
注意:當(dāng)某一條件為真的時(shí)候,則不會(huì)向下執(zhí)行該分支結(jié)構(gòu)的其他語(yǔ)句。
分支結(jié)構(gòu)之嵌套if-else語(yǔ)句
C語(yǔ)言中嵌套if-else語(yǔ)句。嵌套if-else語(yǔ)句的意思,就是在if-else語(yǔ)句中,再寫(xiě)if-else語(yǔ)句。其一般形式為:
循環(huán)結(jié)構(gòu)之while循環(huán)
反復(fù)不停的執(zhí)行某個(gè)動(dòng)作就是江湖人稱(chēng)的循環(huán) 。
C語(yǔ)言中有三種循環(huán)結(jié)構(gòu),先看一下C語(yǔ)言while循環(huán)的結(jié)構(gòu):
其中表達(dá)式表示循環(huán)條件,執(zhí)行代碼塊為循環(huán)體。
while語(yǔ)句的語(yǔ)義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí), 執(zhí)行循環(huán)體代碼塊。
-
while語(yǔ)句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,當(dāng)表達(dá)式的值為假時(shí)不執(zhí)行循環(huán)體,反之則循環(huán)體一直執(zhí)行
-
一定要記著在循環(huán)體中改變循環(huán)變量的值,否則會(huì)出現(xiàn)死循環(huán)(無(wú)休止的執(zhí)行)
-
循環(huán)體如果包括有一個(gè)以上的語(yǔ)句,則必須用{}括起來(lái),組成復(fù)合語(yǔ)句
循環(huán)結(jié)構(gòu)之do-while循環(huán)
C語(yǔ)言中的do-while循環(huán),一般形式如下:
do-while循環(huán)語(yǔ)句的語(yǔ)義是:
它先執(zhí)行循環(huán)中的執(zhí)行代碼塊,然后再判斷while中表達(dá)式是否為真,如果為真則繼續(xù)循環(huán);如果為假,則終止循環(huán)。因此,do-while循環(huán)至少要執(zhí)行一次循環(huán)語(yǔ)句。
注意:使用do-while結(jié)構(gòu)語(yǔ)句時(shí),while括號(hào)后必須有分號(hào)。
循環(huán)結(jié)構(gòu)之for循環(huán)
C語(yǔ)言中for循環(huán)一般形式:
它的執(zhí)行過(guò)程如下:
-
執(zhí)行表達(dá)式1,對(duì)循環(huán)變量做初始化
-
判斷表達(dá)式2,若其值為真(非0),則執(zhí)行for循環(huán)體中執(zhí)行代碼塊,然后向下執(zhí)行;若其值為假(0),則結(jié)束循環(huán)
-
執(zhí)行表達(dá)式3,(i++)等對(duì)于循環(huán)變量進(jìn)行操作的語(yǔ)句
-
執(zhí)行for循環(huán)中執(zhí)行代碼塊后執(zhí)行第二步;第一步初始化只會(huì)執(zhí)行一次
-
循環(huán)結(jié)束,程序繼續(xù)向下執(zhí)行
注意:for循環(huán)中的兩個(gè)分號(hào)一定要寫(xiě)
在for循環(huán)中:
-
表達(dá)式1是一個(gè)或多個(gè)賦值語(yǔ)句,它用來(lái)控制變量的初始值
-
表達(dá)式2是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán)
-
表達(dá)式3是循環(huán)變量的步進(jìn)值,定義控制循環(huán)變量每循環(huán)一次后按什么方式變化
-
這三部分之間用分號(hào)分開(kāi)
結(jié)束語(yǔ)句之break語(yǔ)句
需要中斷循環(huán),在C語(yǔ)言中可以使用break語(yǔ)句進(jìn)行該操作,使用break語(yǔ)句時(shí)注意以下幾點(diǎn):
-
在沒(méi)有循環(huán)結(jié)構(gòu)的情況下,break不能用在單獨(dú)的if-else語(yǔ)句中。
-
在多層循環(huán)中,一個(gè)break語(yǔ)句只跳出當(dāng)前循環(huán)。
結(jié)束語(yǔ)句之continue語(yǔ)句
continue語(yǔ)句的作用是結(jié)束本次循環(huán)開(kāi)始執(zhí)行下一次循環(huán)。
break語(yǔ)句與continue語(yǔ)句的區(qū)別是:
break是跳出當(dāng)前整個(gè)循環(huán),continue是結(jié)束本次循環(huán)開(kāi)始下一次循環(huán)。
分支結(jié)構(gòu)之switch語(yǔ)句
switch語(yǔ)句結(jié)構(gòu)如下:
switch語(yǔ)句時(shí)還應(yīng)注意以下幾點(diǎn):
-
在case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤
-
在case子句后如果沒(méi)有break;會(huì)一直往后執(zhí)行**一直到遇到break;**才會(huì)跳出switch語(yǔ)句
-
switch后面的表達(dá)式語(yǔ)句只能是整型或者字符類(lèi)型
-
在case后,允許有多個(gè)語(yǔ)句,**可以不用{}**括起來(lái)
-
各case和default子句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果
-
default子句可以省略不用
自定義函數(shù)
自定義函數(shù)的一般形式:
注意:
-
[]中包含的內(nèi)容可以省略,數(shù)據(jù)類(lèi)型說(shuō)明省略時(shí)默認(rèn)是int類(lèi)型函數(shù)
-
參數(shù)省略時(shí)表示該函數(shù)是無(wú)參函數(shù),參數(shù)不省略表示該函數(shù)是有參函數(shù)
函數(shù)調(diào)用
需要用到自定義函數(shù)的時(shí)候,就得調(diào)用它,在C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:
函數(shù)名([參數(shù)]);
注意:對(duì)無(wú)參函數(shù)調(diào)用的時(shí)候可以將[]包含的省略。
有參與無(wú)參
在函數(shù)中不需要函數(shù)參數(shù)的稱(chēng)之為無(wú)參函數(shù),在函數(shù)中需要函數(shù)參數(shù)的稱(chēng)之為有參函數(shù)。
有參和無(wú)參函數(shù)的一般形式如下:
有參函數(shù)和無(wú)參函數(shù)的唯一區(qū)別在于:函數(shù) () 中多了一個(gè)參數(shù)列表。
形參與實(shí)參
函數(shù)的參數(shù)分為形參和實(shí)參兩種。
形參是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來(lái)接收調(diào)用該函數(shù)時(shí)傳入的參數(shù)。
實(shí)參是在調(diào)用時(shí)傳遞該函數(shù)的參數(shù)。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
-
形參只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效
-
實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等
-
在參數(shù)傳遞時(shí),實(shí)參和形參在數(shù)量上,類(lèi)型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類(lèi)型不匹配的錯(cuò)誤
函數(shù)的返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值。
函數(shù)的返回值要注意以下幾點(diǎn):
-
函數(shù)的值只能通過(guò)return語(yǔ)句返回主調(diào)函數(shù)
return語(yǔ)句的一般形式為:
return 表達(dá)式
或者為:
return (表達(dá)式);
-
函數(shù)值的類(lèi)型和函數(shù)定義中函數(shù)的類(lèi)型應(yīng)保持一致
如果兩者不一致,則以函數(shù)返回類(lèi)型為準(zhǔn),自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。
-
沒(méi)有返回值的函數(shù),返回類(lèi)型為void
遞歸函數(shù)
遞歸就是一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身,遞歸函數(shù)必須有結(jié)束條件。
執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。
一句話總結(jié)遞歸:自我調(diào)用且有完成狀態(tài)。
例題:
有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2人大兩歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大兩歲。最后 問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大?
程序分析:
利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第5個(gè)人歲數(shù),需知道第4人的歲數(shù),依次類(lèi)推,推到第1人(10歲),再往回推。
#include
int dfs(int n) {
return n == 1 ? 10 : dfs(n - 1) + 2;
}
int main()
{
printf("第5個(gè)人的年齡是%d歲", dfs(5));
return 0;
}
局部與全局
C語(yǔ)言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。
-
局部變量也稱(chēng)為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說(shuō)明的。其作用域僅限于函數(shù)內(nèi), 離開(kāi)該函數(shù)后再使用這種變量是非法的。在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)
-
全局變量也稱(chēng)為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件。其作用域是整個(gè)源程序
變量存儲(chǔ)類(lèi)別
C語(yǔ)言根據(jù)變量的生存周期來(lái)劃分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。靜態(tài)存儲(chǔ)區(qū)中存放了在整個(gè)程序執(zhí)行過(guò)程中都存在的變量,如全局變量。
動(dòng)態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)區(qū)中存放的變量是根據(jù)程序運(yùn)行的需要而建立和釋放的,通常包括:函數(shù)形式參數(shù);自動(dòng)變量;函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址等。
C語(yǔ)言中存儲(chǔ)類(lèi)別又分為四類(lèi):
用關(guān)鍵字auto定義的變量為自動(dòng)變量,auto可以省略,auto不寫(xiě)則隱含定為“自動(dòng)存儲(chǔ)類(lèi)別”,屬于動(dòng)態(tài)存儲(chǔ)方式。如:
用static修飾的為靜態(tài)變量,如果定義在函數(shù)內(nèi)部的,稱(chēng)之為靜態(tài)局部變量;如果定義在函數(shù)外部,稱(chēng)之為靜態(tài)外部變量。如下為靜態(tài)局部變量:
注意:靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類(lèi)別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元,在程序整個(gè)運(yùn)行期間都不釋放;靜態(tài)局部變量在編譯時(shí)賦初值,即只賦初值一次;如果在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。
為了提高效率,C語(yǔ)言允許將局部變量得值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字register作聲明。例如:
注意:只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量;一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目有限,不能定義任意多個(gè)寄存器變量;局部靜態(tài)變量不能定義為寄存器變量。
用extern聲明的的變量是外部變量,外部變量的意義是某函數(shù)可以調(diào)用在該函數(shù)之后定義的變量。如:
內(nèi)部函數(shù)與外部函數(shù)
在C語(yǔ)言中不能被其他源文件調(diào)用的函數(shù)稱(chēng)謂內(nèi)部函數(shù) ,內(nèi)部函數(shù)由static關(guān)鍵字來(lái)定義,因此又被稱(chēng)謂靜態(tài)函數(shù),形式為:
static [數(shù)據(jù)類(lèi)型] 函數(shù)名([參數(shù)])
這里的static是對(duì)函數(shù)的作用范圍的一個(gè)限定,限定該函數(shù)只能在其所處的源文件中使用,因此在不同文件中出現(xiàn)相同的函數(shù)名稱(chēng)的內(nèi)部函數(shù)是沒(méi)有問(wèn)題的。
在C語(yǔ)言中能被其他源文件調(diào)用的函數(shù)稱(chēng)謂外部函數(shù) ,外部函數(shù)由extern關(guān)鍵字來(lái)定義,形式為:
extern [數(shù)據(jù)類(lèi)型] 函數(shù)名([參數(shù)])
C語(yǔ)言規(guī)定,在沒(méi)有指定函數(shù)的作用范圍時(shí),系統(tǒng)會(huì)默認(rèn)認(rèn)為是外部函數(shù),因此當(dāng)需要定義外部函數(shù)時(shí)extern也可以省略。
數(shù)組
程序中也需要容器,只不過(guò)該容器有點(diǎn)特殊,它在程序中是一塊連續(xù)的,大小固定并且里面的數(shù)據(jù)類(lèi)型一致的內(nèi)存空間,它還有個(gè)好聽(tīng)的名字叫數(shù)組??梢詫?shù)組理解為大小固定,所放物品為同類(lèi)的一個(gè)購(gòu)物袋,在該購(gòu)物袋中的物品是按一定順序放置的。
我們來(lái)看一下如何聲明一個(gè)數(shù)組:
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[長(zhǎng)度];
數(shù)組只聲明也不行啊,看一下數(shù)組是如何初始化的。說(shuō)到初始化,C語(yǔ)言中的數(shù)組初始化是有三種形式的,分別是:
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[長(zhǎng)度n] = {元素1,元素2…元素n};
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[] = {元素1,元素2…元素n};
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[長(zhǎng)度n]; 數(shù)組名稱(chēng)[0] = 元素1; 數(shù)組名稱(chēng)[1] = 元素2; 數(shù)組名稱(chēng)[n-1] = 元素n;
我們將數(shù)據(jù)放到數(shù)組中之后又如何獲取數(shù)組中的元素呢?
獲取數(shù)組元素時(shí):
數(shù)組名稱(chēng)[元素所對(duì)應(yīng)下標(biāo)];
如:初始化一個(gè)數(shù)組 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。
注意:
-
數(shù)組的下標(biāo)均以0開(kāi)始
-
數(shù)組在初始化的時(shí)候,數(shù)組內(nèi)元素的個(gè)數(shù)不能大于聲明的數(shù)組長(zhǎng)度
-
mtianyan: 如果采用第一種初始化方式,元素個(gè)數(shù)小于數(shù)組的長(zhǎng)度時(shí),多余的數(shù)組元素初始化為0
-
在聲明數(shù)組后沒(méi)有進(jìn)行初始化的時(shí)候,靜態(tài)(static)和外部(extern)類(lèi)型的數(shù)組元素初始化元素為0,自動(dòng)(auto)類(lèi)型的數(shù)組的元素初始化值不確定
數(shù)組的遍歷
數(shù)組就可以采用循環(huán)的方式將每個(gè)元素遍歷出來(lái),而不用人為的每次獲取指定某個(gè)位置上的元素,例如我們用for循環(huán)遍歷一個(gè)數(shù)組:
注意以下幾點(diǎn):
-
最好避免出現(xiàn)數(shù)組越界訪問(wèn),循環(huán)變量最好不要超出數(shù)組的長(zhǎng)度
-
C語(yǔ)言的數(shù)組長(zhǎng)度一經(jīng)聲明,長(zhǎng)度就是固定,無(wú)法改變,并且C語(yǔ)言并不提供計(jì)算數(shù)組長(zhǎng)度的方法
由于C語(yǔ)言是沒(méi)有檢查數(shù)組長(zhǎng)度改變或者數(shù)組越界的這個(gè)機(jī)制,可能會(huì)在編輯器中編譯并通過(guò),但是結(jié)果就不能肯定了,因此還是不要越界或者改變數(shù)組的長(zhǎng)度。
C語(yǔ)言獲取數(shù)組長(zhǎng)度:
int length = sizeof(arr)/sizeof(arr[0]);
數(shù)組作為函數(shù)參數(shù)
數(shù)組可以由整個(gè)數(shù)組當(dāng)作函數(shù)的參數(shù),也可以由數(shù)組中的某個(gè)元素當(dāng)作函數(shù)的參數(shù)。
整個(gè)數(shù)組當(dāng)作函數(shù)參數(shù),即把數(shù)組名稱(chēng)傳入函數(shù)中,例如:
數(shù)組中的元素當(dāng)作函數(shù)參數(shù),即把數(shù)組中的參數(shù)傳入函數(shù)中,例如:
數(shù)組作為函數(shù)參數(shù)時(shí)注意以下事項(xiàng):
-
數(shù)組名作為函數(shù)實(shí)參傳遞時(shí),函數(shù)定義處作為接收參數(shù)的數(shù)組類(lèi)型形參既可以指定長(zhǎng)度也可以不指定長(zhǎng)度
-
數(shù)組元素作為函數(shù)實(shí)參傳遞時(shí),數(shù)組元素類(lèi)型必須與形參數(shù)據(jù)類(lèi)型一致
數(shù)組的應(yīng)用-冒泡排序
以升序排序?yàn)槔芭菖判虻乃枷耄合噜徳貎蓛杀容^,將較大的數(shù)字放在后面,直到將所有數(shù)字全部排序。就像小學(xué)排隊(duì)時(shí)按大小個(gè)排一樣,將一個(gè)同學(xué)拉出來(lái)和后面的比比,如果高就放后面,一直把隊(duì)伍排好。
#include
int main()
{
double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80};
int i,j;
printf(" ************排隊(duì)前************* ");
for(i=0;i<10;i++)
{
if(i != 9)
printf("%1.2f, ", arr[i]); //%1.2f表示小數(shù)點(diǎn)前一位,小數(shù)點(diǎn)后精確到兩位
else
printf("%1.2f", arr[i]); //%1.2f表示小數(shù)點(diǎn)前一位,小數(shù)點(diǎn)后精確到兩位
}
for(i=8; i>=0; i--)
{
for(j=0;j<=i;j++)
{
if( arr[j]>arr[j+1]) //當(dāng)前面的數(shù)比后面的數(shù)大時(shí)
{
double temp; //定義臨時(shí)變量temp
temp=arr[j];//將前面的數(shù)賦值給temp
arr[j]=arr[j+1]; //前后之?dāng)?shù)顛倒位置
arr[j+1]=temp;//將較大的數(shù)放在后面
}
}
}
printf(" ************排隊(duì)后************* ");
for(i=0;i<10;i++)
{
if(i != 9)
printf("%1.2f, ", arr[i]); //%1.2f表示小數(shù)點(diǎn)前一位,小數(shù)點(diǎn)后精確到兩位
else
printf("%1.2f", arr[i]); //%1.2f表示小數(shù)點(diǎn)前一位,小數(shù)點(diǎn)后精確到兩位
}
return 0;
}
數(shù)組的應(yīng)用-數(shù)組查找功能
當(dāng)我們購(gòu)物之后,拎著購(gòu)物袋回到家,會(huì)一一檢查購(gòu)物袋中的物品看是否缺少或者都是想購(gòu)之物。那么應(yīng)用到程序中,可以使用數(shù)組查找功能,看看是否存在該數(shù)據(jù),如果存在并返回該元素的下標(biāo)。
#include
int getIndex(int arr[5],int value)
{
int i;
int index;
for(i=0;i<5;i++)
{
/* 請(qǐng)完善數(shù)組查詢(xún)功能 */
if(arr[i]==value)
{
index=i;
break;
}
index=-1;
}
return index;
}
int main()
{
int arr[5]={3,12,9,8,6};
int value = 8;
int index = getIndex(arr,value); //這里應(yīng)該傳什么參數(shù)呢?
if(index!=-1)
{
printf("%d在數(shù)組中存在,下標(biāo)為:%d ",value,index);
}
else
{
printf("%d在數(shù)組中不存在。 ",value);
}
return 0;
}
字符串與數(shù)組
C語(yǔ)言中,是沒(méi)有辦法直接定義字符串?dāng)?shù)據(jù)類(lèi)型的,但是我們可以使用數(shù)組來(lái)定義我們所要的字符串。一般有以下兩種格式:
char 字符串名稱(chēng)[長(zhǎng)度] = “字符串值”; //[]中的長(zhǎng)度是可以省略不寫(xiě)的
char 字符串名稱(chēng)[長(zhǎng)度] = {‘字符1’,‘字符2’,…,‘字符n’,’’}; //最后一個(gè)元素必須是’’,’’表示字符串的結(jié)束標(biāo)志
注意:在輸出字符串的時(shí)候可使用如下語(yǔ)句。
printf(“%s”,字符數(shù)組名字);
puts(字符數(shù)組名字);
字符串函數(shù)
常用的字符串函數(shù)如下(strlen,strcmp,strcpy,strcat,atoi):
使用字符串函數(shù)注意以下事項(xiàng):
strlen()獲取字符串的長(zhǎng)度,在字符串長(zhǎng)度中是不包括‘’而且漢字和字母的長(zhǎng)度是不一樣的。比如:
strcmp()在比較的時(shí)候會(huì)把字符串先轉(zhuǎn)換成ASCII碼再進(jìn)行比較,返回的結(jié)果為0表示s1和s2的ASCII碼相等,返回結(jié)果為1表示s1比s2的ASCII碼大,返回結(jié)果為-1表示s1比s2的ASCII碼小,例如:
strcpy()拷貝之后會(huì)覆蓋原來(lái)字符串且不能對(duì)字符串常量進(jìn)行拷貝,比如:
strcat在使用時(shí)s1與s2指的內(nèi)存空間不能重疊,且s1要有足夠的空間來(lái)容納要復(fù)制的字符串,如:
多維數(shù)組
多維數(shù)組的定義格式是:
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[常量表達(dá)式1][常量表達(dá)式2]…[常量表達(dá)式n];
定義了一個(gè)名稱(chēng)為num,數(shù)據(jù)類(lèi)型為int的二維數(shù)組。其中第一個(gè)[3]表示第一維下標(biāo)的長(zhǎng)度,就像購(gòu)物時(shí)分類(lèi)存放的購(gòu)物;第二個(gè)[3]表示第二維下標(biāo)的長(zhǎng)度,就像每個(gè)購(gòu)物袋中的元素。
多維數(shù)組的初始化與一維數(shù)組的初始化類(lèi)似也是分兩種:
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[常量表達(dá)式1][常量表達(dá)式2]…[常量表達(dá)式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}};
數(shù)據(jù)類(lèi)型 數(shù)組名稱(chēng)[常量表達(dá)式1][常量表達(dá)式2]…[常量表達(dá)式n]; 數(shù)組名稱(chēng)[下標(biāo)1][下標(biāo)2]…[下標(biāo)n] = 值;
多維數(shù)組初始化要注意以下事項(xiàng):
-
采用第一種始化時(shí)數(shù)組聲明必須指定列的維數(shù)。mtianyan: 因?yàn)橄到y(tǒng)會(huì)根據(jù)數(shù)組中元素的總個(gè)數(shù)來(lái)分配空間,當(dāng)知道元素總個(gè)數(shù)以及列的維數(shù)后,會(huì)直接計(jì)算出行的維數(shù)
-
采用第二種初始化時(shí)數(shù)組聲明必須同時(shí)指定行和列的維數(shù)
二維數(shù)組定義的時(shí)候,可以不指定行的數(shù)量,但是必須指定列的數(shù)量。
多維數(shù)組的遍歷
多維數(shù)組也是存在遍歷的,和一維數(shù)組遍歷一樣,也是需要用到循環(huán)。不一樣的就是多維數(shù)組需要采用嵌套循環(huán)。
注意:多維數(shù)組的每一維下標(biāo)均不能越界
實(shí)例代碼:
//打印分?jǐn)?shù)
void printScore(int score[])
{
int i;
printf(" ");
for(i=0;i
{
printf("%d ",score[i]);
}
printf(" ");
}
//計(jì)算考試總分
int getTotalScore(int score[])
{
int sum = 0;
int i;
for(i=0;i
{
sum+=score[i];
}
return sum;
}
//計(jì)算平均分
int getAvgScore(int score[])
{
return getTotalScore(score)/N;
}
//計(jì)算最高分
int getMax(int score[])
{
int max = -1;
int i;
for(i=0;i
{
if(score[i]>max)
{
max = score[i];
}
}
return max;
}
//計(jì)算最低分
int getMin(int score[])
{
int min =100;
int i;
for(i=0;i
{
if(score[i]< min)
{
min = score[i];
}
}
return min;
}
//分?jǐn)?shù)降序排序
void sort(int score[])
{
int i,j;
for(i=N-2;i>=0;i--)
{
for(j=0;j<=i;j++)
{
if(score[j]
1 ]){
int temp;
temp = score[j];
score[j] = score[j+1];
score[j+1]=temp;
}
}
}
printScore(score);
}
int main()
{
int score[N]={67,98,75,63,82,79,81,91,66,84};
int sum,avg,max,min;
sum = getTotalScore(score);
avg = getAvgScore(score);
max = getMax(score);
min = getMin(score);
printf("總分是:%d ",sum);
printf("平均分是:%d ",avg);
printf("最高分是:%d ",max);
printf("最低分是:%d ",min);
printf("----------成績(jī)排名--------- ");
sort(score);
return 0;
}
原文標(biāo)題:C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)匯總
文章出處:【微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
審核編輯:湯梓紅
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137780 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
62992 -
數(shù)據(jù)類(lèi)型
+關(guān)注
關(guān)注
0文章
236瀏覽量
13667
原文標(biāo)題:C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)匯總
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>](https://file1.elecfans.com/web2/M00/82/4F/wKgaomRI71GAYX3DAABNQ-ZTaOo064.png)
C語(yǔ)言中基本數(shù)據(jù)類(lèi)型、變量和常量的使用
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>、變量和常量的使用](https://file1.elecfans.com/web2/M00/91/52/wKgaomTfLmmAIM02AAE0mH4JJXQ295.jpg)
技術(shù)干貨驛站 ▏深入理解C語(yǔ)言:基本數(shù)據(jù)類(lèi)型和變量
![技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>:基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>和變量](https://file1.elecfans.com/web2/M00/FC/CD/wKgZomaWI5uASgBaAABuQHdMO4I302.png)
C語(yǔ)言基本數(shù)據(jù)類(lèi)型,變量和常量
C預(yù)處理與C語(yǔ)言基本數(shù)據(jù)類(lèi)型
Java的基本數(shù)據(jù)類(lèi)型與條件結(jié)構(gòu)
單片機(jī)C語(yǔ)言中常用的基本數(shù)據(jù)類(lèi)型分為哪幾類(lèi)
C語(yǔ)言教程之C語(yǔ)言基本數(shù)據(jù)類(lèi)型與順序程序設(shè)計(jì)講解
C語(yǔ)言程序設(shè)計(jì)教程之基本數(shù)據(jù)類(lèi)型和運(yùn)算符及表達(dá)式的資料說(shuō)明
![<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)教程之基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>和運(yùn)算符及表達(dá)式的資料說(shuō)明](https://file.elecfans.com/web1/M00/83/CE/pIYBAFxKwwuARA8YAAauYAAl6-s455.png)
C語(yǔ)言的數(shù)據(jù)儲(chǔ)存與數(shù)據(jù)類(lèi)型及類(lèi)型轉(zhuǎn)換的詳細(xì)資料說(shuō)明
51單片機(jī)學(xué)習(xí)筆記(9)——C51的基本數(shù)據(jù)類(lèi)型和擴(kuò)充數(shù)據(jù)類(lèi)型
![51單片機(jī)學(xué)習(xí)筆記(9)——<b class='flag-5'>C</b>51的基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>和擴(kuò)充<b class='flag-5'>數(shù)據(jù)類(lèi)型</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Struct結(jié)構(gòu)數(shù)據(jù)類(lèi)型
C語(yǔ)言-基本數(shù)據(jù)類(lèi)型與位運(yùn)算
基本數(shù)據(jù)類(lèi)型分享
![基<b class='flag-5'>本數(shù)據(jù)類(lèi)型</b>分享](https://file1.elecfans.com/web2/M00/89/93/wKgZomSICTyARQmOAABFi3J5fsY204.png)
評(píng)論