當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 淺談程序員的開端——C語言
技術(shù)總結(jié):
在進(jìn)行軟件開發(fā)的時(shí)候,技術(shù)迭代更新速度極快。而想要快速掌握這些技術(shù),需要非常扎實(shí)的基礎(chǔ)才行。那么,現(xiàn)在我們就來談一談程序員的開端——C語言。C語言中,最困難的兩大知識(shí)點(diǎn)就當(dāng)屬指針與函數(shù)。指針的困難點(diǎn)倒不是在于它本身,困難的是指針與其他數(shù)據(jù)類型相結(jié)合,其形成的組合種類較多,最后導(dǎo)致指針難以理解。下面,我們就先從指針說起。
指針的基礎(chǔ):
指針的概念:
指針實(shí)際上就是地址。指針是在計(jì)算機(jī)自動(dòng)在內(nèi)存中分配的一塊空間,該空間用來存儲(chǔ)地址(該空間大小由操作系統(tǒng)來決定,64位操作系統(tǒng),需要用64位,也就是8字節(jié)空間來保存地址),而存儲(chǔ)的這個(gè)地址,是該指針?biāo)赶虻哪菈K空間的首地址。int *p = &A;
我們想要通過指針取到A空間中的數(shù)據(jù),可以使用*p來取(注意:*p表示的是A這塊空間,而不是A空間中的數(shù)據(jù),就像int A; 變量名A,表示的是A這個(gè)空間)。而A空間的首地址可以由p或&A來表示。
這樣,指針的本質(zhì)就講完了,是不是很就簡單?但這只是開始。
指針的組合:
指針與數(shù)組的組合:
指針與數(shù)組的組合有很多,如:數(shù)組指針,多級(jí)指針,函數(shù)指針,結(jié)構(gòu)體指針。數(shù)組指針中,比較難理解的就是,指針與二維數(shù)組的組合。想要弄清楚指針與二維數(shù)組的組合,我們先來看一維數(shù)組。一維數(shù)組的。。。。。。
函數(shù)的基礎(chǔ):
函數(shù)的概念:
函數(shù)實(shí)際上就是程序的跳轉(zhuǎn),即先將當(dāng)前程序的狀態(tài)保存在棧中,然后跳轉(zhuǎn)到相對(duì)應(yīng)的函數(shù)內(nèi),依次執(zhí)行函數(shù)內(nèi)的程序指令。當(dāng)函數(shù)執(zhí)行完后,函數(shù)被釋放,然后恢復(fù)之前保存在棧中的程序狀態(tài),再接著往下執(zhí)行程序。
我們之所以需要函數(shù),主要還是因?yàn)槲覀儾豢赡軐⒁粋(gè)項(xiàng)目中的所有程序指令都寫在main函數(shù)中去,一旦項(xiàng)目復(fù)雜的話,對(duì)程序的修改和調(diào)試將是一場災(zāi)難。如下圖:
所以在做項(xiàng)目的時(shí)候,我們保證項(xiàng)目高內(nèi)聚,低耦合。這個(gè)時(shí)候就需要函數(shù)來將代碼封裝起來了。我們常常使用的函數(shù)都是封裝起來的,而使用函數(shù)的難點(diǎn)就在于函數(shù)的參數(shù)如何填寫和判斷函數(shù)的返回值是什么。
函數(shù)的形參與返回值:
函數(shù)的格式: 返回值類型 函數(shù)名字(形參)
函數(shù)填寫:test(arr);(arr是數(shù)組名,也是數(shù)組的首地址)
(注意:如果此時(shí)是test(int p),則因?yàn)樾螀閕nt類型而不是指針類型,所以不能寫成test(arr); 我們可以填寫成test(arr[1]),arr數(shù)組中的每一個(gè)元素都為int類型。這樣可以,將arr數(shù)組中的第一個(gè)元素傳入到tset函數(shù)中去。)
(注意:在函數(shù)內(nèi)定義的數(shù)組,在函數(shù)結(jié)束后,數(shù)組會(huì)被釋放,如果將此數(shù)組作為返回值返回給main函數(shù)的話,由于數(shù)組已經(jīng)被釋放了,所以數(shù)組無法被找到,會(huì)發(fā)生錯(cuò)誤。解決辦法:1.堆 malloc 2.靜態(tài)變量 static)
函數(shù)填寫:xx(test)(test是另外一個(gè)函數(shù)的名字)
我們知道,函數(shù)的名字就是函數(shù)的入口也就是函數(shù)的首地址。所以,由此可知函數(shù)指針的本質(zhì)就是用來保存函數(shù)的首地址(即函數(shù)名)
void (*p)(int)實(shí)際上就是,void (*)(int) p(定義了一個(gè)指針,其中void (*)(int)為指針類型,p為指針),例如:void (*)(int) p = test;其中p就表示為一個(gè)指向函數(shù)test()的函數(shù)指針。前面我們說過,指針實(shí)際上就是地址,也就是說void (*)(int) p是一個(gè)用來保存函數(shù)text函數(shù)首地址的指針(即用來保存test函數(shù)名字)。但是void (*)(int) p這種格式,C語言標(biāo)準(zhǔn)不認(rèn)可,我們需要寫成void (*p)(int)這種格式。
xx(int x)是一個(gè)函數(shù),其返回值為void(*)(int)函數(shù)指針類型,即其返回值是一個(gè)指向其他函數(shù)的指針。注意:xx(int x)是一個(gè)函數(shù),而不是一個(gè)用來保存地址的指針,所以此時(shí)void (*)(int)就為函數(shù)的返回值,而不是指針的指針類型。
好了,到目前為止,函數(shù)基本的使用我們已經(jīng)知道了。但是編程還是需要大量的實(shí)踐與理論學(xué)習(xí),多看看經(jīng)典的計(jì)算機(jī)書籍,會(huì)讓我們對(duì)編程的理解更加深入。