胡昊 遼寧錦州渤海大學(xué)信息科學(xué)與技術(shù)學(xué)院
C語(yǔ)言編程技術(shù)的分析研究
胡昊 遼寧錦州渤海大學(xué)信息科學(xué)與技術(shù)學(xué)院
C語(yǔ)言作為新型語(yǔ)言中的一種,被廣泛應(yīng)用于計(jì)算機(jī)編程,是通用計(jì)算機(jī)編程語(yǔ)言,存在于電腦中的形式是一些命令指令,人和電腦之間的交流其實(shí)就是通過(guò)命令執(zhí)行實(shí)現(xiàn)的,由于C語(yǔ)言靈活性強(qiáng),所以用來(lái)解決很多的繁瑣的難題,C語(yǔ)言在數(shù)學(xué)算術(shù)領(lǐng)域中都有著重大的應(yīng)用,在一定程度加快了計(jì)算機(jī)的運(yùn)算的速度和擴(kuò)展了運(yùn)算的范圍,此外C語(yǔ)言在生活中的應(yīng)用也很廣泛,然而由于使用者沒(méi)有很好地掌握C語(yǔ)言的嚴(yán)謹(jǐn)性以及C語(yǔ)言的復(fù)雜性從而在具體的應(yīng)用中出現(xiàn)了很多的問(wèn)題。調(diào)試C語(yǔ)言代碼性的錯(cuò)誤是一個(gè)繁瑣的過(guò)程,所以本文針對(duì)這個(gè)問(wèn)題,進(jìn)行了C語(yǔ)言編程技術(shù)的分析。
C語(yǔ)言編程 分析 技術(shù)
許多編程人員比較青睞于C語(yǔ)言編程,因?yàn)镃語(yǔ)言的風(fēng)格符合現(xiàn)代人的習(xí)慣,也符合模塊化的設(shè)計(jì)思想,同時(shí)C語(yǔ)言編程的層次分明,方便調(diào)試以及維護(hù)。正是因?yàn)镃語(yǔ)言編程的特點(diǎn)是清晰、明了,同時(shí)可移植以及具有強(qiáng)大的功能等,所以C語(yǔ)言編程在很多的領(lǐng)域都得到了普遍的運(yùn)用。C語(yǔ)言提供了很多低級(jí)處理的功能,并且擁有著很好的跨平臺(tái)特性,我們使用的標(biāo)準(zhǔn)規(guī)格編寫(xiě)的C語(yǔ)言程序可以在很多平臺(tái)上進(jìn)行編譯,在現(xiàn)今的軟件開(kāi)發(fā)中,使用很普遍。目前在我國(guó)的很多計(jì)算機(jī)等級(jí)考試中的的考試內(nèi)容就圍繞著C語(yǔ)言。但是由于C語(yǔ)言編寫(xiě)的特點(diǎn)是靈活性強(qiáng),同時(shí)語(yǔ)法約束不強(qiáng),所以很多的初學(xué)者在學(xué)習(xí)指針內(nèi)容時(shí),就容易出現(xiàn)錯(cuò)誤,如果指針使用錯(cuò)誤,那么代碼的可讀性就比較差,同時(shí)運(yùn)行效率也比較低。因此在后期的調(diào)試中,指針錯(cuò)誤從而導(dǎo)致了很多的嚴(yán)重問(wèn)題,而且這些問(wèn)題解決起來(lái)也不是很容易。
1.1 C語(yǔ)言中的函數(shù)
在C語(yǔ)言的編程過(guò)程中,通常會(huì)采用模塊化的思想,把一個(gè)復(fù)雜的程序,拆分成多個(gè)子程序進(jìn)行完成,其中的每一個(gè)程序?qū)崿F(xiàn)一個(gè)子模塊功能,最終通過(guò)調(diào)用各個(gè)子模塊的接口,從而完成整個(gè)程序的整合。函數(shù)是能夠完成一定相關(guān)功能的執(zhí)行代碼段,可以將函數(shù)分為內(nèi)、外兩部分,外部負(fù)責(zé)數(shù)據(jù)輸送,并且輸送數(shù)據(jù)便能得到結(jié)果,而內(nèi)部便是由代碼段構(gòu)成的“運(yùn)算器”,它負(fù)責(zé)將輸入的數(shù)據(jù)進(jìn)行處理。每一個(gè)函數(shù)都實(shí)現(xiàn)了應(yīng)有的功能在C語(yǔ)言的編程中,功能的實(shí)現(xiàn)是通過(guò)函數(shù)名反映的。C語(yǔ)言程序中,他的函數(shù)數(shù)量是無(wú)限的,但是,其中必須有一個(gè)并且僅有一個(gè)以“main”為名的主函數(shù)。通常情況下,需要注意的是函數(shù)定義包括的內(nèi)容有函數(shù)名、返回值類型以及參數(shù)名,然而由于C語(yǔ)言的編譯系統(tǒng)攜帶了很多的函數(shù)庫(kù),這些函數(shù)庫(kù)中包括了很多的之前就已經(jīng)定義好的函數(shù),所以當(dāng)需要實(shí)現(xiàn)某個(gè)功能的時(shí)候,只需要在代碼的開(kāi)頭加上“#include”的指令就可以將函數(shù)庫(kù)中的函數(shù)調(diào)用出來(lái)。
1.2 算法技巧及位操作
算法被定義為:一系列解決問(wèn)題的清晰指令。算法我們也可以理解為它是有基本運(yùn)算及其規(guī)定的運(yùn)算順序所組成的完整的運(yùn)算步驟,它也是一個(gè)按照要求設(shè)計(jì)好的有限的確切的計(jì)算序列。一個(gè)算法它將擁有以下五個(gè)重要的特征:有窮性、確切性、輸入、輸出、可行性。在設(shè)計(jì)程序的過(guò)程中,程序的靈魂離不開(kāi)算法,如何掌握算法的技巧對(duì)于編程人員至關(guān)重要。算法的表示方法主要分為了流程圖與自然語(yǔ)言,當(dāng)編程人員采用流程圖的形式表述算法思路的時(shí)候,需要事先對(duì)流程圖中的各個(gè)符號(hào)有所掌握。在計(jì)算機(jī)的程序設(shè)計(jì)過(guò)程中,位運(yùn)算是可操作的最小數(shù)據(jù)單位,通常情況在,要想實(shí)現(xiàn)算法的除法或者是乘法,可以通過(guò)位運(yùn)算實(shí)現(xiàn),從而大大提高代碼的運(yùn)行速率。因?yàn)橛?jì)算機(jī)的數(shù)據(jù)都是以二進(jìn)制的形式儲(chǔ)存,位運(yùn)算就是直接對(duì)內(nèi)存中存儲(chǔ)的二進(jìn)制數(shù)據(jù)進(jìn)行操作,因此十分快捷。位運(yùn)算的基礎(chǔ)操作符有以下六種“&、|、^、~、<<、>>”,在這六種操作符中,只有“~”取反是單目操作符,其余“&、|、^、<<、>>”五種均為雙目操作符。而且,在使用過(guò)程中,一定需要注意:位操作只作用于整形數(shù)據(jù),“double、float”類型數(shù)據(jù)都會(huì)出現(xiàn)錯(cuò)誤。
使用位操作時(shí),由于位操作符運(yùn)算優(yōu)先級(jí)低,為了保證它的運(yùn)算順序,我們通常使用括號(hào)來(lái)使它運(yùn)算正常,否則得出的結(jié)果啼笑皆非。比如我們現(xiàn)在要得到一組等差數(shù)列數(shù)據(jù):1,3,5,7,9……。如果我們寫(xiě)成int a=1<2 指針用法
在C語(yǔ)言中指針是一個(gè)十分重要的數(shù)據(jù)類型,同時(shí)C語(yǔ)言重要內(nèi)容之一是指針。將指針運(yùn)用到C語(yǔ)言的編程中能夠大大地提高代碼的運(yùn)行效率,同時(shí)還可以大大地節(jié)省代碼的存儲(chǔ)空間,然而指針對(duì)于很多的初學(xué)者而言有一定的難度。一旦沒(méi)有正確掌握指針的用法,那么在代碼運(yùn)行的過(guò)程中就會(huì)引發(fā)很多的問(wèn)題。指針?biāo)赶虻氖谴鎯?chǔ)空間,而存儲(chǔ)空間的分配方式能夠分為靜態(tài)和動(dòng)態(tài)分配兩種。所謂的靜態(tài)分配指的是當(dāng)C程序在編寫(xiě)的時(shí)候存儲(chǔ)空間就已經(jīng)確定下來(lái)了。當(dāng)選擇全局變量的時(shí)候,比如static char b[sizes],指的是分配給變量b的空間是sizes比如定義的是一個(gè)局部變量char c[sizes],那么在函數(shù)執(zhí)行的過(guò)程中,局部變量b所得到的空間是sizes,當(dāng)調(diào)用函數(shù)結(jié)束后變量b的存儲(chǔ)空間就會(huì)被自動(dòng)釋放。所謂的動(dòng)態(tài)分配指的是通過(guò)庫(kù)函數(shù)malloc (sizes)堆中的調(diào)用從而給變量分配的空間是sizes,當(dāng)結(jié)束調(diào)用后返回的值類型是指針,在編程的過(guò)程中一定要記住,當(dāng)時(shí)存儲(chǔ)空間使用結(jié)束后,一定要記得通過(guò)free()函數(shù)釋放空間。使用C語(yǔ)言進(jìn)行代碼的編程時(shí)候,必須要正確掌握指針的用法,不然如果使用錯(cuò)誤,就會(huì)出現(xiàn)一系列的錯(cuò)誤,這些錯(cuò)誤具體總結(jié)如下:
(1)當(dāng)使用C語(yǔ)言編程,定義指針變量的時(shí)候,沒(méi)有給指針賦初值,從而使得該指針變量成為了一個(gè)“野指針”。所以在當(dāng)后面用到了這個(gè)指針?biāo)赶虻目臻g的時(shí)候,就會(huì)出現(xiàn)代碼性的錯(cuò)誤,由于指針變量定義后,指針變量所對(duì)應(yīng)的值是未知的,也就是說(shuō)指針可以指向任意一個(gè)內(nèi)存地址,這個(gè)時(shí)候指針?biāo)赶虻膬?nèi)存直接完成賦值操作,把這個(gè)單元里最初的數(shù)據(jù)覆蓋掉,從而造成了數(shù)據(jù)的缺失,如果指針指向系統(tǒng)的數(shù)據(jù)區(qū),那么會(huì)造成系統(tǒng)運(yùn)行出現(xiàn)異常,最壞的情況是出現(xiàn)了系統(tǒng)死機(jī)。所以,在使用C語(yǔ)言編程代碼的時(shí)候一定要給指針變量賦值,保證正確使用指針。
(2)指針空間分配使用的語(yǔ)句為q=malloc(size),需要先檢查參數(shù)q,如果p=NULL那么說(shuō)明了這個(gè)存儲(chǔ)空間為空,這個(gè)時(shí)候就不可以操作p所指向的空間,即便是分配了空間給p,其空間必須是C語(yǔ)言所規(guī)定的空間范圍之內(nèi)。當(dāng)空間運(yùn)用結(jié)束后,必須要通過(guò)free函數(shù)釋放該空間,不然容易造成存儲(chǔ)空間耗盡的情況。
(3)棧溢出。棧的作用主要是用于當(dāng)一個(gè)子函數(shù)被調(diào)用的時(shí)候,完成現(xiàn)場(chǎng)的保存以及現(xiàn)場(chǎng)的恢復(fù),同時(shí)還包括了局部變量的參數(shù)傳遞以及局部變量的存儲(chǔ)等然而在調(diào)用子函數(shù)中,當(dāng)錯(cuò)誤使用子函數(shù)里面的局部變量指針,就會(huì)產(chǎn)生棧溢出的現(xiàn)象。比如子函數(shù)的代碼如下:
char point1[10];
strcpy(point1,“ warning: this is a testing case ...”);
因?yàn)樵谶@個(gè)棧中只分配了10個(gè)字節(jié)空間給局部變量,但是使用函數(shù)strcpy()的時(shí)候,指針point1指向的超過(guò)了10個(gè)字節(jié)的字符串,所以這個(gè)時(shí)候很可能會(huì)重寫(xiě)把棧中所存放的函數(shù)返回地址的內(nèi)容,因此在執(zhí)行完子函數(shù)之后原來(lái)的函數(shù)就很難回去了,執(zhí)行將會(huì)終止。
(4)堆溢出。使用堆的時(shí)候需要考慮到代碼運(yùn)行的平臺(tái)的以及編譯器,堆溢出是一個(gè)很復(fù)雜的過(guò)程。比如程序代碼:
char * point1;
point1=(char *) malloc(10);
strcpy(point1,“warning: this is a testing case ..”);
由于point1指針定義中,所分配的是10個(gè)字節(jié)空間,但是當(dāng)在執(zhí)行函數(shù)strcpy()的時(shí)候指針point1指向的是超過(guò)了10的字符串,所以造成了堆溢出,從而導(dǎo)致程序報(bào)錯(cuò)。
(5)void用法。在定義函數(shù)的時(shí)候,如果函數(shù)名前面有void,那么意味著這個(gè)函數(shù)的返回值是空,然而這種情況除了庫(kù)函數(shù)void malloc(size)之外,這個(gè)函數(shù)名的前面也有void,但是這并不意味著malloc(size)的返回值是空,而是意味著函數(shù)的返回值能夠轉(zhuǎn)換成任意其他的類型地址值(比如string* ,float *,long *等)。void不可以用在數(shù)值變量的定義過(guò)程中,然而指針變量的定義能夠用void來(lái)實(shí)現(xiàn),void的真正意思是指針變量能夠指向所有的數(shù)據(jù)類型的地址。
(6)在使用過(guò)程中,區(qū)分?jǐn)?shù)組是不同于指針變量的,可以通過(guò)指針加減數(shù)值來(lái)實(shí)現(xiàn)指針的位置移動(dòng),比如q+=9,指的是將指針q的位置往后面移動(dòng)9個(gè)位置;但是數(shù)組名是可以移動(dòng)的,比如char a[22];a++;不可以這樣操作數(shù)組a。
(7)當(dāng)移動(dòng)指針的時(shí)候,挪動(dòng)的位移和所定義的指針類型是有關(guān)系的,比如分別將指針p與q定義成:char*p;int*q;后續(xù)的語(yǔ)句:p+=20;q+=20;那么這意味著字符型指針p是往后面移動(dòng)了20個(gè)字節(jié),同時(shí)整型指針q往后面移動(dòng)了20個(gè)長(zhǎng)度,也就是80個(gè)字節(jié)。使用指針變量的時(shí)候一定要保證和所定義的類型是一樣的。
(8)需要注意所定義的指針變量的區(qū)別。比如定義為:int(* p) [20]和int* p[20],這兩者之間是有區(qū)別的,int(* p) [20]中的(* p)為先,因p指的是一個(gè)指針變量,指向了包含有20個(gè)整型數(shù)的數(shù)組;同時(shí)int * p[20]代表著p[20]為先,所以指的是定義了指針數(shù)組p,該變量它包括了20個(gè)指向整型數(shù)組的指針元素。
C語(yǔ)言編程方法能夠大大地增強(qiáng)程序的運(yùn)行效率以及代碼的可讀性。下面將對(duì)C語(yǔ)言編程優(yōu)化進(jìn)行簡(jiǎn)單地描述。
當(dāng)調(diào)用函數(shù)的時(shí)候傳遞結(jié)構(gòu)是被禁止的。函數(shù)調(diào)用第一步是把參數(shù)傳遞給寄存器或者堆棧,當(dāng)函數(shù)參數(shù)在傳遞的過(guò)程中,內(nèi)容是結(jié)構(gòu)的話,那么C語(yǔ)言編譯器就要把整個(gè)結(jié)構(gòu)全部拷貝到到堆棧中,從而造成了堆??臻g負(fù)擔(dān),這個(gè)時(shí)候能夠通過(guò)采取結(jié)構(gòu)指針減少空間的負(fù)荷。在C語(yǔ)言編程中編程效率的優(yōu)化可以通過(guò)C語(yǔ)言中自帶的庫(kù)函數(shù)實(shí)現(xiàn)。然而,由于在設(shè)計(jì)的時(shí)候這些標(biāo)準(zhǔn)庫(kù)具有自身的廣泛適用性,所以該函數(shù)庫(kù)的使用是有約束條件的。而且即使是使用了函數(shù)庫(kù),由于代碼量大,所以很容易造成,代碼運(yùn)行效率低的結(jié)果。比如庫(kù)函數(shù)srPintf()的實(shí)現(xiàn)就是通過(guò)許多的代碼完成的,在編程中如果編程人員調(diào)用的srPintf()函數(shù)是不包括浮點(diǎn)處理(%f),最好是編程人員自己設(shè)計(jì)代碼完成整個(gè)功能,這樣可以大大提高代碼效率。
結(jié)語(yǔ):采用C語(yǔ)言進(jìn)行編程的軟件有著很大的開(kāi)發(fā)前景,針對(duì)C語(yǔ)言編程有很多方面都需要引起注意,對(duì)C語(yǔ)言進(jìn)行優(yōu)化可以大大地提高C語(yǔ)言的運(yùn)行效率,編程人員要想正確掌握C語(yǔ)言的編程,需要多多地理論聯(lián)系實(shí)踐,多多地參與編程的實(shí)踐中,并且對(duì)C語(yǔ)言的編程方法不斷進(jìn)行優(yōu)化處理,從而增強(qiáng)C語(yǔ)言的編程可讀性以及可移植性。C語(yǔ)言在眾多的領(lǐng)域中都有著重大的意義,所以正確掌握C語(yǔ)言是十分必要的。本文主要針對(duì)C語(yǔ)言編程技術(shù)進(jìn)行了分析,介紹了C語(yǔ)言函數(shù),指針正確使用以及C語(yǔ)言優(yōu)化等方面。
[1]潘津.C語(yǔ)言編程技巧在C語(yǔ)言學(xué)習(xí)中的應(yīng)用研究[J].電子技術(shù)與軟件工程,2013(16):218-218
[2]侯成杰.航天器C語(yǔ)言軟件常見(jiàn)編程錯(cuò)誤分析及檢測(cè)方法研究[J].空間控制技術(shù)與應(yīng)用,2013,39(6):53-57
[3]劉秀明.基于C語(yǔ)言的計(jì)算機(jī)軟件編程實(shí)驗(yàn)研究[J].電子技術(shù)與軟件工程,2014(5):263-263
[4]祁昌平.C語(yǔ)言程序設(shè)計(jì) 課程教學(xué)探討[J].電腦知識(shí)與技術(shù),2009,5(17):4488-4489