C語(yǔ)言語(yǔ)法總結(jié)
寫(xiě)在開(kāi)篇:本篇文章適合C語(yǔ)言初學(xué)者和想梳理和回顧一下C語(yǔ)言整體語(yǔ)法的看官继蜡,由于考慮不要對(duì)初學(xué)者灌以較深的知識(shí)點(diǎn)而讓其失去學(xué)習(xí)的興趣栗菜,本篇文章知識(shí)點(diǎn)比較全面且不深保礼,請(qǐng)看官自己決定是否閱讀以免浪費(fèi)您寶貴的時(shí)間纹磺!
C語(yǔ)言作為一種底層面向過(guò)程語(yǔ)言蕉斜,在編程語(yǔ)言中有著舉足輕重的地位洒试,基本上“科班”出身的計(jì)算機(jī)系學(xué)生第一個(gè)接觸的編程語(yǔ)言都是C語(yǔ)言,因?yàn)楣P者上大一的時(shí)候(2004年)也是學(xué)習(xí)了C語(yǔ)言庶溶,但是長(zhǎng)時(shí)間沒(méi)有運(yùn)用了煮纵,所以對(duì)C語(yǔ)言知識(shí)點(diǎn)做一個(gè)梳理懂鸵,也為后續(xù)開(kāi)發(fā)FFmpeg音視頻做一個(gè)堅(jiān)實(shí)的基礎(chǔ)。好的廢話不多說(shuō)行疏,先來(lái)個(gè)HelloWorld鎮(zhèn)樓:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello World!\n");
return 0;
}
常用基本類型:
整型:short, int, long
short:16位匆光,占2個(gè)字節(jié)
int:32位,占4個(gè)字節(jié)
long:32位酿联,占4個(gè)字節(jié)
浮點(diǎn)型:float, double
float:32位终息,精度低
double:32位,精度高
注:浮點(diǎn)型適合做科學(xué)運(yùn)算贞让,但是計(jì)算速度相對(duì)慢周崭,如果不是做科學(xué)計(jì)算,那么最好使用整型數(shù)據(jù)震桶。
char型:8位休傍,1個(gè)字節(jié)征绎。只代表一個(gè)字符蹲姐。
void型:一般使用指針的時(shí)候使用。
變量與常量:
int a = 0; //變量人柿,可以進(jìn)行賦值柴墩,其中的值可以更改的
const int len = 256; //常量,定義之后凫岖,值不可以再改變 const是關(guān)鍵字江咳,需要寫(xiě)在前面
算術(shù)運(yùn)算和比較運(yùn)算:
算術(shù)運(yùn)算:
+, -, *, /, %:加/ 減/ 乘/ 除/ 余
比較運(yùn)算:
>, ==, <, >=, <=, !=: 大于/ 等于/ 小于/ 大于等于/ 小于等于/ 不等
流程控制語(yǔ)句:
條件控制語(yǔ)句if else:
if(a>b){
執(zhí)行語(yǔ)句……;
} else {
執(zhí)行語(yǔ)句……;
}
循環(huán)控制語(yǔ)句while, do while, for:
while(條件){
執(zhí)行循環(huán)的語(yǔ)句……
}
do{
執(zhí)行循環(huán)的語(yǔ)句……
}while(條件)
for(int i = 0; i < 10; i++){
執(zhí)行循環(huán)的語(yǔ)句……
}
函數(shù):
函數(shù)用來(lái)實(shí)現(xiàn)函數(shù)體中的功能,本著高內(nèi)聚哥放,低耦合的思想歼指,在函數(shù)內(nèi)部只針對(duì)函數(shù)要實(shí)現(xiàn)的功能做開(kāi)發(fā),而與其他的函數(shù)最好是沒(méi)有關(guān)聯(lián)甥雕。
void func(int i){
函數(shù)體
}
函數(shù)由返回值踩身,函數(shù)名,參數(shù)社露,函數(shù)體組成挟阻。
文件操作:
C語(yǔ)言中對(duì)文件的操作是先定義一個(gè)FILE變量,然后對(duì)這個(gè)file變量進(jìn)行操作
簡(jiǎn)單實(shí)例:
#include<stdio.h>
int main(int argc, char* argv[]){
FILE* file;
char buf[1024] = {0,};
file = fopen("1.txt", "a+");
fwrite("hello, world!", 1, 13, file);
rewind(file);
fread(buf, 1, 20, file);
fclose(file);
printf("buf = %s\n", buf);
return 0;
}
a+:表示addition峭弟,如果1.txt存在則在1.txt文本內(nèi)容的后面追加內(nèi)容附鸽,如果不存在1.txt,則創(chuàng)建1.txt瞒瘸。
fwrite中的參數(shù):第一個(gè)參數(shù)是你要寫(xiě)入的內(nèi)容坷备,第二個(gè)參數(shù)是第一個(gè)參數(shù)中每個(gè)字符占幾個(gè)字節(jié),第三個(gè)參數(shù)是第一個(gè)參數(shù)一共多少個(gè)字節(jié)情臭,第四個(gè)參數(shù)是要寫(xiě)入那個(gè)文件中击你。
fread中的參數(shù):第一個(gè)參數(shù)要將數(shù)據(jù)內(nèi)容讀到哪里玉组,第二個(gè)參數(shù)是將這個(gè)內(nèi)容按幾個(gè)字節(jié)一份進(jìn)行讀取(例子中是一個(gè)字節(jié)一個(gè)字節(jié)的讀)丁侄,第三個(gè)參數(shù)是一共讀取多少個(gè)字節(jié)惯雳,第四個(gè)參數(shù)是從哪里讀取。
rewind:這個(gè)是讓光標(biāo)回到file的文本內(nèi)容的首位(和數(shù)據(jù)庫(kù)游標(biāo)概念類似)鸿摇,否則光標(biāo)停留在最后(因?yàn)榍懊鎓open的時(shí)候輸入的參數(shù)是"a+"石景,意思是在最后追加)。
fclose:在使用完文件之后需要關(guān)閉這個(gè)文件拙吉。
指針:
指針是C語(yǔ)言的靈魂潮孽,沒(méi)有學(xué)過(guò)指針相當(dāng)于沒(méi)學(xué)過(guò)C語(yǔ)言。
指針存放的是指向某個(gè)值的地址筷黔,關(guān)鍵字是*
int *a 這里a存放的是指向*a值的地址往史,&a存放的是指向a的地址
這里稍微提及一下操作系統(tǒng)是如何管理內(nèi)存的。下面三個(gè)概念需要了解一下:椃鸩眨空間椎例,堆空間和內(nèi)存映射:
棧空間:我們每記錄一個(gè)函數(shù)的時(shí)候请祖,操作系統(tǒng)會(huì)給我們分配一段椂┩幔空間;而當(dāng)函數(shù)退出的時(shí)候肆捕,操作系統(tǒng)又會(huì)回收這段椝⒔空間。這就是為什么局部變量有作用域的原因慎陵。一般椦凼空間的大小是4M-8M。
堆空間:操作系統(tǒng)為每個(gè)進(jìn)程一般賦予4G左右的空間席纽,操作系統(tǒng)會(huì)占1G捏悬,剩下3G都是堆空間的。堆空間一般存放全局變量和靜態(tài)變量胆筒。
內(nèi)存映射:磁盤(pán)中的文件映射到內(nèi)存中邮破,只要對(duì)內(nèi)存中的更改,磁盤(pán)也會(huì)更改仆救,這樣會(huì)大大提升速度抒和,一般運(yùn)用在數(shù)據(jù)庫(kù)操作。
指針如何分配和釋放內(nèi)存彤蔽?
分配空間:
void* mem = malloc(size);
釋放內(nèi)存:
free(mem);
使用malloc關(guān)鍵字摧莽,接后面參數(shù)的大小,就分配了堆空間的內(nèi)存顿痪。在分配內(nèi)存并使用之后一镊辕!定油够!要!釋征懈!放石咬!掉!之前分配掉的內(nèi)存卖哎,要不然會(huì)出現(xiàn)內(nèi)存泄漏的情況鬼悠,內(nèi)存泄漏多了就會(huì)產(chǎn)生內(nèi)存溢出的現(xiàn)象。當(dāng)然還有一種情況是野指針亏娜,野指針是指占用了別人的內(nèi)存焕窝,當(dāng)你已經(jīng)釋放了內(nèi)存之后,別人申請(qǐng)了這塊內(nèi)存维贺,你就不能繼續(xù)再用這塊內(nèi)存了它掂。
函數(shù)指針:
返回值類型(*指針變量名)([形參列表]);
int func(int a, int b); /* 聲明一個(gè)函數(shù) */
int (*f)(int a, int b); /* 聲明一個(gè)函數(shù)指針 */
f = func; /* 將函數(shù)func的首地址賦值給指針f */
函數(shù)指針的優(yōu)點(diǎn)在于:一個(gè)函數(shù)指針可以指向不同的函數(shù),也就是不改變函數(shù)名字的前提下溯泣,可以讓函數(shù)有不同的行為(類似于java的多態(tài))虐秋。
結(jié)構(gòu)體:
結(jié)構(gòu)體有點(diǎn)類似于OOP中的class,但是不同的是其中只能定義變量不能定義方法发乔。
關(guān)鍵字struct熟妓,相當(dāng)于自定義類型雪猪。
struct st{
int a;
int b;
};
使用的時(shí)候需要寫(xiě)全 struct st sst栏尚, 然后使用“.”來(lái)調(diào)用定義的成員變量 sst.a = 10, sst.b = 20
枚舉類型:
枚舉的意義在于限制了枚舉類型的對(duì)象只能在一個(gè)限定范圍中去選擇。
enum e_type{
red = 0,
green,
blue
};
使用的時(shí)候需要寫(xiě)全 enum e_type et, 然后使用“.”來(lái)調(diào)用定義的成員變量 et.red
需要注意的是枚舉中的變量是自增1的只恨,green就是2译仗,blue就是3。