日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C語(yǔ)言編程核心要點(diǎn)是什么

這篇文章主要講解了“C語(yǔ)言編程核心要點(diǎn)是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C語(yǔ)言編程核心要點(diǎn)是什么”吧!

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),菏澤企業(yè)網(wǎng)站建設(shè),菏澤品牌網(wǎng)站建設(shè),網(wǎng)站定制,菏澤網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,菏澤網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

C精簡(jiǎn)的語(yǔ)法集和標(biāo)準(zhǔn)庫(kù),讓我們可以把精力集中到設(shè)計(jì)等真正重要的事情上來(lái),而不是迷失在語(yǔ)法的海洋里,這對(duì)于初學(xué)者尤其重要。雖然C有抽象不足的缺點(diǎn),但我更喜歡它的精巧,只需要花少量的時(shí)間,研究清楚它每一個(gè)知識(shí)點(diǎn),看任何C源碼就不會(huì)存在語(yǔ)法上的障礙,大家需要建立的知識(shí)共識(shí)足夠少,少即是多,少好于多。

我教過6個(gè)人編程,教過HTML,教過JAVA,也教過C++。最近,我在教我小孩編程,他只有十歲,很多人建議我選擇Python,但我最終選擇了C,因?yàn)镃簡(jiǎn)單且強(qiáng)大,現(xiàn)在看來(lái),好像是個(gè)不錯(cuò)的選擇。

類型

C是強(qiáng)類型語(yǔ)言,有short、long、int、char、float、double等build-in數(shù)據(jù)類型,類型是貫穿c語(yǔ)言整個(gè)課程的核心概念。

struct、union、enum屬于c的構(gòu)造類型,用于自定義類型,擴(kuò)充類型系統(tǒng)。

變量

變量用來(lái)保存數(shù)據(jù),數(shù)據(jù)是操作的對(duì)象,變量的變字意味著它可以在運(yùn)行時(shí)被修改。

變量由類型名+變量名決定,定義變量需要為變量分配內(nèi)存,可以在定義變量的同時(shí)做初始化。

int i;  float f1 = 0.5, f2= 0.8;

常量

const int i = 100; const char* p = "hello world";

運(yùn)行中恒定、不可變,編譯期便可確定。

數(shù)組

光有簡(jiǎn)單變量顯然不夠,我們需要數(shù)組,它模擬現(xiàn)實(shí)中相同類型的多個(gè)元素,這些對(duì)象是緊密相鄰的,通過數(shù)組名+位置索引便能訪問每個(gè)元素。

二維、三維、高緯數(shù)組本質(zhì)上還是線性的,二維數(shù)組通過模擬行列給人平面的感覺,實(shí)際存儲(chǔ)上還是連續(xù)內(nèi)存的方式。

數(shù)組是靜態(tài)的,在定義的時(shí)候,數(shù)組的長(zhǎng)度就已經(jīng)確認(rèn),運(yùn)行中無(wú)法伸縮,所以有時(shí)候我們不得不為應(yīng)付擴(kuò)充多分配一些空間。數(shù)組元素不管用多用少,它都在哪里,有時(shí)候,我們會(huì)用一個(gè)int  n去界定數(shù)組實(shí)際被使用的元素個(gè)數(shù)。

函數(shù)

函數(shù)封裝行為,是模塊化的最小單元,函數(shù)使得邏輯復(fù)用變得可能。

C是過程式的,現(xiàn)實(shí)世界都可以封裝為一個(gè)個(gè)過程(函數(shù)),通過過程串聯(lián)和編排模擬世界。

用C編程,行為和數(shù)據(jù)是分離的。調(diào)用函數(shù)的時(shí)候,調(diào)用者通過參數(shù)向函數(shù)傳遞信息,函數(shù)通過返回值向調(diào)用者反饋結(jié)果。

函數(shù)最好是無(wú)副作用的,函數(shù)內(nèi)應(yīng)該盡量避免修改全局變量或者靜態(tài)局部變量,更好的方式是通過參數(shù)傳遞進(jìn)來(lái),這樣的函數(shù)只是邏輯的盒子,它滿足線程安全的要求。

有了變量和函數(shù),就可以編寫簡(jiǎn)單的程序了。

控制語(yǔ)句

  • 分支:if 、else、else if、switch case、?:

  • 循環(huán):while、do while、for

  • break、continue、goto、default

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

build-in數(shù)據(jù)類型不足以描繪現(xiàn)實(shí)世界,或者用build-in類型描述不夠直接,結(jié)構(gòu)體用來(lái)模擬復(fù)合類型,它賦予了我們擴(kuò)充類型系統(tǒng)的能力,我們把類型組合到一起構(gòu)建更復(fù)雜的類型,而每個(gè)被組合的成分就叫成員變量。

結(jié)構(gòu)體內(nèi)的成分,對(duì)象通過點(diǎn)(.)運(yùn)算符,指針通過箭頭(->)訪問成員。

指針

C的靈魂是指針,指針帶來(lái)彈性,指針的本質(zhì)是地址。

需要區(qū)分指針和指針指向的對(duì)象,多個(gè)指針變量可指向同一個(gè)對(duì)象,一個(gè)指針不能同時(shí)指向多個(gè)對(duì)象。

指針相關(guān)的基本操作包括:賦值(修改指針指向),解引用(訪問指針指向的對(duì)象),取地址(&variable),指針支持加減運(yùn)算。

因?yàn)橹羔樧兞恳芨采w整個(gè)內(nèi)存空間,所以指針變量的長(zhǎng)度等于字長(zhǎng),32位系統(tǒng)下32位4字節(jié),64位系統(tǒng)下64位8字節(jié)。

指針的含義遠(yuǎn)比上述豐富,指針跟數(shù)組結(jié)合便有了指針數(shù)組(int* p[n])和數(shù)組指針(int  (*p)[n]),指針跟函數(shù)結(jié)合便有了函數(shù)指針(ret_type (*pf)(param list)),指針跟const結(jié)合便有了const  char*/char* const/const char* const,還有指向指針的指針(int **p)。

既可以定義指向build-in數(shù)據(jù)類型的指針,也可以定義指向struct的指針,void*表示通用(萬(wàn)能)指針,它不能被解引用,也不能做指針?biāo)阈g(shù)運(yùn)算。

函數(shù)指針與回調(diào)(callback)

c source  code被編譯鏈接后,函數(shù)被轉(zhuǎn)換到可執(zhí)行程序文件的text節(jié),進(jìn)程啟動(dòng)的時(shí)候,會(huì)把text節(jié)的內(nèi)容裝載到進(jìn)程的代碼段,代碼段是c進(jìn)程內(nèi)存空間的一部分,所以任何c函數(shù)都會(huì)占一塊內(nèi)存空間,函數(shù)指針就是指向函數(shù)在代碼段的第一行匯編指令,函數(shù)調(diào)用就會(huì)跳轉(zhuǎn)到函數(shù)的第一個(gè)指令處執(zhí)行。

函數(shù)指針經(jīng)常被用來(lái)作為回調(diào)(callback),c語(yǔ)言也會(huì)用包含函數(shù)指針成員的結(jié)構(gòu)體模擬OOP,本質(zhì)上是把C++編譯器做的事情,轉(zhuǎn)給程序員來(lái)做(C++為包含虛函數(shù)的類構(gòu)建虛函數(shù)表,為包含虛函數(shù)的類對(duì)象附加虛函數(shù)表的指針)。

字符串

char*是一類特殊的指針,它被稱為c風(fēng)格字符串,因?yàn)樗偸且?lsquo;\0’作為結(jié)尾的標(biāo)識(shí),所以要標(biāo)識(shí)一個(gè)字符串,有一個(gè)char*指針就夠了,字符串的長(zhǎng)度被0隱式指出,跟字符串相關(guān)的STD  C API大多以str打頭,比如strlen/strcpy/strcat/strcmp/strtok。

內(nèi)存和內(nèi)存管理

指針提供了c語(yǔ)言直接操作底層內(nèi)存的能力,c程序區(qū)分棧內(nèi)存和堆內(nèi)存,棧內(nèi)存是函數(shù)內(nèi)的局部變量,它隨程序執(zhí)行而動(dòng)態(tài)伸縮,所以不要返回臨時(shí)變量的指針,棧內(nèi)存容量有限(8/16M),所以我們要避免在函數(shù)內(nèi)創(chuàng)建過大的局部變量,要警惕遞歸爆棧。

堆內(nèi)存也叫動(dòng)態(tài)內(nèi)存,它由一個(gè)叫動(dòng)態(tài)內(nèi)存配置器的標(biāo)準(zhǔn)庫(kù)組件管理,glibc的默認(rèn)動(dòng)態(tài)內(nèi)存配置器叫ptmalloc,初始版本有性能問題,但后面用線程私有解決了競(jìng)爭(zhēng)改善了性能。動(dòng)態(tài)內(nèi)存配置器是介于kernel與應(yīng)用層的一個(gè)層次,從內(nèi)核視角看ptmalloc是應(yīng)用程序,從應(yīng)用層來(lái)看ptmalloc又是系統(tǒng)庫(kù)。malloc跟free必須配對(duì),這是程序員的職責(zé),動(dòng)態(tài)分配的內(nèi)存丟失引用就會(huì)導(dǎo)致內(nèi)存泄漏,指向已釋放的內(nèi)存塊俗稱野(懸垂)指針。

預(yù)處理

從c source file到可執(zhí)行程序需要經(jīng)過預(yù)處理-編譯-匯編-鏈接多個(gè)階段,預(yù)處理階段做替換、消除和擴(kuò)充,預(yù)處理語(yǔ)句以#打頭。

宏定義,#define,宏定義可以用\做行連接,#用來(lái)產(chǎn)生字符串,##用來(lái)拼接,宏定義的時(shí)候要注意加()避免操作符優(yōu)先級(jí)干擾,可以用do  while(0)來(lái)把定義作為單獨(dú)語(yǔ)句,#undef是define的反操作。

#if #ifdef #ifndef #else #elif #endif用來(lái)?xiàng)l件編譯,為了避免頭文件重復(fù)包含,經(jīng)常用#ifndef #define  #endif。

#include用來(lái)做頭文件包含;#pragma用來(lái)做行為控制;#error用來(lái)在編譯的時(shí)候輸出錯(cuò)誤信息。

__FILE__、__LINE__、_DATE_、_TIME_、_STDC_等標(biāo)準(zhǔn)預(yù)定義宏可以被用來(lái)做一些debug用途。

#typedef用來(lái)定義類型別名。比如typedef int money_t;money_t比int更有含義。

typedef也能用來(lái)為結(jié)構(gòu)體取別名,有時(shí)候會(huì)這樣寫:

typedef struct {   int a;   int b; } xyz_t;

這樣在定義結(jié)構(gòu)體變量的時(shí)候就可以少敲幾下鍵盤。

typedef也可以用來(lái)重定義函數(shù)指針類型,比如 typedef void (*PF) (int a, int b);  PF是函數(shù)指針類型,而非函數(shù)指針變量。

枚舉

枚舉能增加代碼可讀性和可維護(hù)性,枚舉本質(zhì)上是int,只是為了更有含義,將有限取值的幾個(gè)int值放在一組,比如定義性別:enum sex { male =  1, female };

可以在定義的時(shí)候賦值,比如male=1,后面的值依次遞增1,如果不賦值則從0開始。

聯(lián)合體(union)

結(jié)構(gòu)體和聯(lián)合體(共用體)的區(qū)別在于:結(jié)構(gòu)體的各個(gè)成員會(huì)占用不同的內(nèi)存,互相之間沒有影響;而共用體的所有成員占用同一段內(nèi)存,修改一個(gè)成員會(huì)影響其余所有成員。

union u_data {     int n;     char ch;     double f; };

其實(shí)本質(zhì)上,聯(lián)合體就是對(duì)一塊內(nèi)存的多種解釋,大小按最大的來(lái)。

位域(bitfield)

struct SNField {        unsigned char seq:7 ;        // frame sequnce        unsigned char startbit:1 ;   // indicate if it's starting frame 1 for yes. };

節(jié)省空間,在面向底層的編碼,或者編寫處理網(wǎng)絡(luò)等程序時(shí)候用的比較多,注意這個(gè)語(yǔ)法特征是跟機(jī)器架構(gòu)相關(guān)的。

位操作

  1. 位與 &

  2. 位或 |

  3. 位取反 ~

  4. 位異或 ^

  5. 位移 << >>

static、extern、register、volatile、sizeof

  1. static修飾全局函數(shù),表示模塊內(nèi)(編譯單元)內(nèi)可用,不需要導(dǎo)出全局符號(hào)。

  2. static修飾局部變量,意味超越函數(shù)調(diào)用的生命周期,不存儲(chǔ)在棧上,只會(huì)被初始化1次。

  3. extern聲明外部變量。

  4. register,寄存器變量,建議編譯器將變量放在寄存器里。

  5. volatile,告訴編譯器不要做優(yōu)化,每次從內(nèi)存讀取,不做寄存器優(yōu)化。

  6. sizeof求大小,可以作用于變量,類型,表達(dá)式

可變參數(shù)

void simple_printf(const char* fmt, ...) va_list、va_start、va_arg、va_end

C的高級(jí)感

  1. 泛型:linux內(nèi)核鏈表,通過offset和內(nèi)嵌node,寫出泛型鏈表

  2. OOP:通過定義帶函數(shù)指針成員變量的結(jié)構(gòu)體,在運(yùn)行中,為結(jié)構(gòu)體對(duì)象設(shè)置上函數(shù)指針,模擬運(yùn)行時(shí)綁定,實(shí)現(xiàn)類似OOP多態(tài)的感覺。

GNU C擴(kuò)展

GNU C擴(kuò)展不是標(biāo)準(zhǔn)C,建議以符合標(biāo)準(zhǔn)C的方式編寫C代碼,但如果你閱讀linux kernel code,你會(huì)發(fā)現(xiàn)有很多有趣看不懂的語(yǔ)法,它來(lái)自GNU  C擴(kuò)展,它確實(shí)也帶來(lái)了一些便利性。

比如結(jié)構(gòu)體成員可以不按定義順序初始化:

struct test_t { int a; int b; };  struct test_t t1 = { .b = 1, .a = 2 };

比如可以通過指定索引初始化數(shù)組:

int a[5] = {[2] 5,[4] 9};

或 int a[5] = { [2] = 4, [4] = 9 };

相當(dāng)于int a[5] = {0, 0, 4, 0, 9};

或者int a[100] = {[0 ... 9] = 1, [10 ... 98] = 2, 3};

比如0長(zhǎng)度數(shù)組

struct foo {    int i;    char a[0]; };

比如用變量作為數(shù)組長(zhǎng)度

void f(int n) {     char a[n];     ... }

比如case范圍,case 'A' ... 'Z' case 1 ... 10

比如表達(dá)式擴(kuò)展({...}),比如三元運(yùn)算符擴(kuò)展...

感謝各位的閱讀,以上就是“C語(yǔ)言編程核心要點(diǎn)是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C語(yǔ)言編程核心要點(diǎn)是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁(yè)名稱:C語(yǔ)言編程核心要點(diǎn)是什么
URL網(wǎng)址:http://www.dlmjj.cn/article/gispso.html