曹雁 湖北職業(yè)技術(shù)學(xué)院信息技術(shù)學(xué)院
關(guān)鍵字:指針 自增自減
指針是C語(yǔ)言的重要概念之一,利用指針可以簡(jiǎn)化程序,簡(jiǎn)化字符串和數(shù)組的操作,解決了函數(shù)調(diào)用多個(gè)返回值的問(wèn)題,能夠直接訪問(wèn)內(nèi)存地址,提高了程序的運(yùn)行效率、節(jié)省了內(nèi)存。自增、自減運(yùn)算符也是C語(yǔ)言的重要的、非常實(shí)用的運(yùn)算符,用法靈活。指針是C語(yǔ)言的難點(diǎn)和重點(diǎn),而和自增、自減運(yùn)算符相結(jié)合雖然使用簡(jiǎn)單靈活,但是學(xué)生普遍反映不太理解、更不會(huì)使用,稍不注意就會(huì)出錯(cuò)。本文結(jié)合作者多年的C語(yǔ)言教學(xué)和軟件開(kāi)發(fā)經(jīng)驗(yàn),解析指針和自增、自減運(yùn)算符的結(jié)合使用。
自增自減運(yùn)算符++和--表示對(duì)變量本身的值加1和減1,但根據(jù)是否先引用再改變變量的值,又有兩種使用方法,分別是前置模式和后置模式。前置模式是先運(yùn)算再引用,后置模式是先引用再運(yùn)算。舉例說(shuō)明:
分析上述代碼段,第二行代碼是自增運(yùn)算符的前置模式,也就是先將變量a的值加1,然后賦值給變量b,即該行執(zhí)行完畢后,變量a和b的值都是5。第三行代碼是自增運(yùn)算符的后置模式,也就是先將變量a的值賦值給變量c,再將變量a的值加1,即該行執(zhí)行完畢后,變量a和c的值分別是6和5。
案例1:使用指針訪問(wèn)一維數(shù)組
分析上述代碼,函數(shù)scanf()調(diào)用需要提供輸入數(shù)據(jù)的地址,指針變量p用于保存數(shù)組的首地址,p++使得循環(huán)過(guò)程中p不斷指向下一個(gè)元素。
*p++表達(dá)式結(jié)合過(guò)程為*(p++),先取p指向的元素的值,再將該指針變量p自增,也就是先*p,然后p++,使p后移。這里學(xué)生容易出錯(cuò)。
案例2:統(tǒng)計(jì)字符串中的“*”的個(gè)數(shù)
上述程序運(yùn)行結(jié)果不正確,主要在于語(yǔ)句①中的p++,實(shí)際運(yùn)行過(guò)程中,while表達(dá)式先使用p所指向的變量的值,再將p向前移動(dòng)一個(gè)元素。語(yǔ)句②中的p和語(yǔ)句①的p顯然已經(jīng)不是同一個(gè)值,結(jié)果自然就不對(duì)了。更正時(shí)只要將語(yǔ)句①的*p++更改為*p,然后在while循環(huán)體內(nèi)增加p++語(yǔ)句。
指針和自增自減運(yùn)算符的結(jié)合使用是一把雙刃劍,一方面簡(jiǎn)化了表達(dá)式,為程序設(shè)計(jì)帶來(lái)了很大的便利,但同時(shí)由于運(yùn)算符優(yōu)先級(jí)和結(jié)合性以及指針的復(fù)雜性,稍微不注意就會(huì)出錯(cuò),并且錯(cuò)誤很隱蔽。本文根據(jù)多年的教學(xué)經(jīng)驗(yàn)和積累,總結(jié)了C語(yǔ)言中指針和自增自減運(yùn)算符的使用規(guī)律、展示了常見(jiàn)的使用錯(cuò)誤并進(jìn)行了分析。