C語(yǔ)言知識(shí)點(diǎn)梳理

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;
}

常用基本類(lèi)型:

整型: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)概念類(lèi)似),否則光標(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:我們每記錄一個(gè)函數(shù)的時(shí)候,操作系統(tǒng)會(huì)給我們分配一段??臻g;而當(dāng)函數(shù)退出的時(shí)候,操作系統(tǒng)又會(huì)回收這段??臻g。這就是為什么局部變量有作用域的原因。一般??臻g的大小是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)存并使用之后一!定!要!釋?zhuān)》?!掉!之前分配掉的?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ù)指針:

    返回值類(lèi)型(*指針變量名)([形參列表]);

    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ù)有不同的行為(類(lèi)似于java的多態(tài))。

結(jié)構(gòu)體:

結(jié)構(gòu)體有點(diǎn)類(lèi)似于OOP中的class,但是不同的是其中只能定義變量不能定義方法。
關(guān)鍵字struct,相當(dāng)于自定義類(lèi)型。
struct st{
    int a;
    int b;
};
使用的時(shí)候需要寫(xiě)全 struct st sst, 然后使用“.”來(lái)調(diào)用定義的成員變量 sst.a = 10, sst.b = 20

枚舉類(lèi)型:

枚舉的意義在于限制了枚舉類(lèi)型的對(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。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容