




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言中用戶標識符的1、舟遙遙以輕飏,風飄飄而吹衣。2、秋菊有佳色,裛露掇其英。3、日月擲人去,有志不獲騁。4、未言心相醉,不再接杯酒。5、黃發(fā)垂髫,并怡然自樂。C語言中用戶標識符的C語言中用戶標識符的1、舟遙遙以輕飏,風飄飄而吹衣。2、秋菊有佳色,裛露掇其英。3、日月擲人去,有志不獲騁。4、未言心相醉,不再接杯酒。5、黃發(fā)垂髫,并怡然自樂。第十二章C語言中用戶標識符的作用域和存儲類知識點1:局部變量與全局變量1.局部變量又稱內(nèi)部變量。全局變量又稱外部變量。2.在函數(shù)內(nèi)部或復合語句內(nèi)部定義的變量稱局部變量,形參也是局部變量,其作用域從定義的位置開始到本函數(shù)或本復合語句結(jié)束。3.在函數(shù)外部定義的變量稱全局變量,其作用域從定義的位置開始到本源文件結(jié)束。4.在同一個源文件中不同函數(shù)中的局部變量可以同名,不同復合語句中的局部變量可以同名。25.在同一個源文件中,全局變量可以和局部變量同名,局部變量將屏蔽同名全局變量。6.在函數(shù)體外進行的函數(shù)原型說明也使該函數(shù)具有全局的性質(zhì),其有效范圍是從說明處起到源文件結(jié)束。例如:inta;intf(intx,inty){intj;j=a;…}main(){intx,y;x=a;…}3新課程標準明確指出:“數(shù)學教學應該為學生提供有趣的、豐富的問題情境,創(chuàng)設(shè)與學生生活環(huán)境、知識背景密切相關(guān)的又使學生感興趣的問題情境,使學生感到數(shù)學就在自己身邊,讓學生在現(xiàn)實情境中體驗和理解數(shù)學,體會到學習數(shù)學的樂趣,和數(shù)學的價值?!币?、情境教學的基本特征1.情境性?!扒榫场笔翘骄拷虒W的出發(fā)點和切入點。“情”就是將學生的興趣、需要、態(tài)度、情感的培養(yǎng)納入課堂教學?,F(xiàn)實環(huán)境或模擬世界的創(chuàng)設(shè),拉近知識與學生現(xiàn)實生活的距離,使學生感到知識和客觀世界、現(xiàn)實生活密切相關(guān)。2.問題性?!皢栴}”是探究的方向與動力,是學生學習新知的源頭所在,學生要在解決問題的過程中學會學習,建構(gòu)新知,根據(jù)學習內(nèi)容,創(chuàng)設(shè)學生熟悉或感興趣,與學習新知緊密相關(guān)的情境,利于學生提取信息,提出數(shù)學問題。3.啟發(fā)性。作為數(shù)學情境的材料或活動,必須富有啟發(fā)性,能激發(fā)學生的求知欲,引發(fā)小學生廣泛的聯(lián)想和想象。4.針對性。作為情境的材料或活動應針對學生的實際和教學內(nèi)容的特點,為實現(xiàn)教學目標服務。5.趣味性。作為情境的材料或活動應盡量新穎有趣。對材料或活動產(chǎn)生直接興趣,能有效地激發(fā)學生的學習動機。二、情境教學是落實新課標的有效途徑數(shù)學課堂上,為滿足學生的爭強好勝心理,教師可根據(jù)學生已有的知識結(jié)構(gòu),有意識地創(chuàng)設(shè)"爭論式"情境,給學生設(shè)置知識擂臺,造成認知沖突,在一個個交鋒的回合中,啟迪學生的思維,培養(yǎng)學生運用已有的知識經(jīng)驗分析、解決新問題的能力,培養(yǎng)學生思維的深刻性。教師在創(chuàng)設(shè)爭論式問題情境時,可以按照以下幾個原則:1.重視創(chuàng)設(shè)促進學生思考和探究的問題情境這種實例是很多的,當你乘車沿一條平坦的路向前行駛時,你是否發(fā)現(xiàn)前方那些高的建筑物好象“沉”到了位于他們前面的一些矮一些的建筑物后面去了?而當你經(jīng)過他們之后,那些沉下去的建筑物又“冒”了出來。(大多數(shù)學生連連點頭)這一情形在學習解直角三角形的應用內(nèi)容時,可以抽象為側(cè)視圖。如果你所在的位置為A,BD和CE兩幢樓的高度分別為15米和45米,它們的間距為50米,而你所在的位置A距離BD為20米,且ABC在一直線上,請問此時你能看到高樓CE嗎,如果看不到,那么AB間的距離應大于幾米才可能看到?這樣的問題情境是很多學生經(jīng)歷過的,對學生有根強的吸引力。而對這樣問題的解決,學生的許多個人知識和直接經(jīng)驗都用得上,它還可以便學生體會到從實際問題中提煉出數(shù)學模型,再將數(shù)學模型納入相應的知識體系去處理,從而解決實際問題的數(shù)學建摸思想。2.只給出問題的條件(或結(jié)論),讓學生爭論出不同的結(jié)果(或應具備的條件);3.對已給出的條件(或結(jié)論)做出增刪,讓學生在交流爭論中歸納出原先給定的結(jié)論(或條件)的變化;4.對條件、結(jié)論完整的問題,先給出條件,讓學生在交流、爭論中猜想結(jié)論,并進行證明等;5.創(chuàng)設(shè)試誤式情境,優(yōu)化學生的思維品質(zhì)數(shù)學課堂上,教師可針對學生對某些概念、法則、定理、性質(zhì)等理解不透徹的情況或在聯(lián)接中考中的易錯易混點,有目的地創(chuàng)設(shè)一些具有迷惑性的問題情境,使學生走進迷魂陣,不斷碰壁,引導他們走出思維誤區(qū),給其指點迷津的過程中,使之吃一塹長一智,錯誤的思維逐漸棄之,正確的思維得到優(yōu)化。例如:在教學不等式性質(zhì)時,讓學生觀察下列過程:∵3>-5,兩邊都乘以-2得:-6>10對嗎?學生都知道不對,但問題出在哪里?經(jīng)過學生的思考,加深了對不等式的性質(zhì)⑶的認識:不等式的兩邊都乘以(或除以)同一個負數(shù),不等號的方向改變。再如:怎樣用刻度尺檢查一個四邊形零件是不是矩形?有的同學錯答為"只須用刻度尺量一下對角線長度,如果相等,則是矩形,否則不是。"錯誤地認為"對角線相等的四邊形是矩形",此同學對一些基礎(chǔ)理論掌握不到位。三、創(chuàng)設(shè)情境注意增添學生數(shù)學的信心信心是學生學習動力的關(guān)鍵,進而取得一次又一次成功。為讓學生得到成功體驗,創(chuàng)設(shè)成功情境時應注意做到:1.根據(jù)學生基礎(chǔ)的上、中、下不同層次,創(chuàng)設(shè)易、中、難不同層次的問題情境,使他們跳一跳都能摘到桃子。2.創(chuàng)設(shè)與本堂內(nèi)容緊密相關(guān)的歷屆"中考題"(原題),使他們解對后體會到我也會做中考題。3.學生獲得成功時,要適當?shù)目隙?、贊許、鼓勵,充分利用學生因獲得成功而激發(fā)他們更大的求知欲望。在情境課堂上,引導學生自主學習,學生在自己的參與實踐中會產(chǎn)生諸多復雜的心理體驗,從而使學生在情感、態(tài)度、價值觀方面得到全面的發(fā)展。學生在有趣的、現(xiàn)實的問題情境中,對數(shù)學有了更加濃厚的好奇心和求知欲;在自主探索的過程中,體驗到了創(chuàng)新的樂趣;在小組合作解決問題的過程中,學會了聆聽、互助、接納、贊賞;在自主解決問題的過程中,增強了克服困難的勇氣,樹立了自信;在發(fā)現(xiàn)問題,應用問題的過程中,深刻體驗到了數(shù)學與生活的聯(lián)系,以及數(shù)學的價值等等。這些看似無形的因素,一直是我們以前的教學中所缺乏的,也是將來的教學所應加強的,它對于促進學生的發(fā)展有著非常重要的意義。以建構(gòu)主義學習理論為指導,以創(chuàng)設(shè)問題情境開展教學為途徑,進行有效學習。這是數(shù)學教育的重心真正轉(zhuǎn)移到學生發(fā)展上來的具體舉措,也是新課標的一大亮點,在這一過程中,學生的雙基、數(shù)學思考能力、解決問題能力以及情感、態(tài)度、價值觀四者之間形成了一個有機的整體,并得到了很好的發(fā)展。初中《歷史》對于學生來說是一門新學科,它既沒有語文那么豐富,也沒有數(shù)學那么深奧,但是它卻是人類發(fā)展歷程的一個縮寫。但是很多學生對歷史有著很多的不理解,認為它不是重點學科,沒有學習數(shù)理化那么重要,其實他們都錯了。學生們之所以沒有對歷史產(chǎn)生興趣,對其理解和認識不夠深入,這有學生自身的問題,也有學校和教師的教學方法的問題,文章中重點講述了提高學生對歷史學習興趣和提高學生歷史成績的新方法。一、高素質(zhì)教師隊伍教師隊伍的學術(shù)水平,決定了他們的課堂講授效果,很多老師沒有很高的學歷,對歷史的掌握也不是很好,那么往往就會出現(xiàn)老師講課只念課本,沒有穿插入任何典故和需要思考的問題。這是學校老師素質(zhì)不高的表現(xiàn),這就導致了學生對歷史不感興趣,歷史成績下滑的情況出現(xiàn)。所以老師的素質(zhì)在歷史教學中起著舉足輕重的作用,一個好的、閱歷豐富的歷史老師,在講課過程中會注意學生對什么歷史知識感興趣,從而找到講課的切入點,然后把學生一步步帶進課本,然后把知識傳授給學生。教師講課的風格也是非常重要的,我國歷史是一個豐富多彩的歷程,老師應該慷慨激昂地去講述歷史,讓學生對歷史認識產(chǎn)生興趣,讓他們明白中國的歷史演變。所以一個初中歷史老師的水平在歷史教學中,起著非常重要的作用。老師的素質(zhì)不僅僅表現(xiàn)在老師的學歷方面,老師的閱歷也占到了很大的成分,還有就是老師的個人魅力。一個學歷很高,但是閱歷很少的老師,講課不會有很大說服力的。一個有個人魅力的老師,學生們會不自覺的對其很尊重,覺得學不好這門課就對不起老師的感覺,這是非常重要的,而老師個人魅力的培養(yǎng)也是一個長期積累的過程,不是靠突擊就能完成的。所以提高老師的綜合水平,是現(xiàn)在教育所面臨的一個大問題。二、引用歷史事件為了給學生創(chuàng)造一個輕松的課堂氣氛和學習氛圍,老師應該抓住學生對歷史典故感興趣這一特點,在課堂講述過程中加入歷史事件,然后帶領(lǐng)學生去分析這些問題,達到活躍課堂氣氛的目的。同時引用歷史典故,也是初中歷史教學必不可少的一部分。老師要根據(jù)學生的實際情況,來講述不同的典故,然后讓學生開發(fā)自己的思維,讓他們?nèi)ニ伎?,然后運用所學的理論,來總結(jié)他們對這個典故的理解和觀點,最后老師對學生的觀點進行點評,對好的觀點讓他們繼續(xù)發(fā)揚,不全面的觀點,就給學生填補。例如講到中日關(guān)系的問題時,老師可以讓學生看一些中日關(guān)系紀錄片,然后讓學生們總結(jié)平時所收集到的有關(guān)日本發(fā)展和中國發(fā)展,以及中日之間的戰(zhàn)爭和友誼問題。老師可以找個別的案例來給學生描述歷史的發(fā)展,例如中日甲午戰(zhàn)爭,為什么偌大的中國會失敗呢?中國損失了什么,日本得到了什么?戰(zhàn)爭對中國形成了什么影響,日本通過戰(zhàn)爭得到了什么?這些問題老師可以給學生安排下去,讓學生通過自己的總結(jié),來回答老師的問題。教師通過對學生所收集到的信息,進行總結(jié)和統(tǒng)計,然后找到一些解釋合理的答案,聯(lián)系課堂進行講述。老師還可以讓學生來回答中國將來和日本的關(guān)系會怎么樣,這都是一些開放性的題目,可以提高學生的思維能力。同時歷史課還可以起到教育孩子的目的,讓他們看到各國的發(fā)展和衰敗,總結(jié)經(jīng)驗教訓,加強他們的愛國觀念,這些對于培養(yǎng)全面發(fā)展的人才是非常有必要的。三、發(fā)揮學生的主動性《歷史》是一門開放性的學科,所以初中歷史課要培養(yǎng)學生的主動性,這對于歷史學習是非常有必要的。民主輕松的學習氣氛可以給學生帶來很大的激情,讓他們在心情舒暢的情況下學習。這就需要老師做到鼓勵學生,照顧好每一位學生,并且要注意保護學生的自尊心和學習熱情,取消他們畏懼的心理,真正體現(xiàn)出師生平等。這樣他們才會樂于去學習和參與老師的教學工作。培養(yǎng)學生對歷史的興趣也是非常重要的,課外活動就必不可少。例如一些課外討論賽,拿“五四運動”來說,很多人認為這是一個有積極意義的行為,而當時的文壇領(lǐng)袖魯迅先生對“五四運動”卻持有不同的看法。老師可以讓學生們自由分組,讓持有不同觀點的同學進行辯論,最終的獲勝隊伍將獲得老師自制的獎品。這樣不但會加強學生對這一課題的理解,更讓學生對歷史產(chǎn)生了很大興趣,興趣是最好的老師。這樣的教學方式,會讓學生產(chǎn)生一種非常想學歷史的沖動,所以他們會把很多的注意力集中到歷史課堂,記憶老師講述的觀點,然后作為辯駁對方的資料和證據(jù)。同時學生在課下會主動去搜集相關(guān)資料,準備用自己搜集到的知識點打敗對方,這樣學生在快樂中產(chǎn)生了對學習的興趣。初中學生的思維是比較簡單的,他們對于知識世界來說,只是一張白紙,他們要在上面寫什么,是老師和學生一起努力的。輕松的課堂氣氛,讓學生掌握更多的知識,還對知識不反感,這就達到了教育的目的。總之,在課堂教學過程中,老師要采用多種方式來增加歷史課堂的趣味性,進而激發(fā)學生對歷史學習的興趣。學生對歷史有了興趣,就會有激情去了解歷史、學習歷史,積極配合老師的教學工作,學生可以在輕松的氣氛中去學習知識,從而提高教與學的質(zhì)量。最終實現(xiàn)真正意義上的給學生減負,讓學生得到全面發(fā)展,推進新課程的不斷改革和發(fā)展。C語言中用戶標識符的1、舟遙遙以輕飏,風飄飄而吹衣。C語言中第十二章C語言中用戶標識符的作用域和存儲類知識點1:局部變量與全局變量1.局部變量又稱內(nèi)部變量。全局變量又稱外部變量。2.在函數(shù)內(nèi)部或復合語句內(nèi)部定義的變量稱局部變量,形參也是局部變量,其作用域從定義的位置開始到本函數(shù)或本復合語句結(jié)束。3.在函數(shù)外部定義的變量稱全局變量,其作用域從定義的位置開始到本源文件結(jié)束。4.在同一個源文件中不同函數(shù)中的局部變量可以同名,不同復合語句中的局部變量可以同名。2第十二章C語言中用戶標識符的作用域和存儲類知識點1:局部變量5.在同一個源文件中,全局變量可以和局部變量同名,局部變量將屏蔽同名全局變量。6.在函數(shù)體外進行的函數(shù)原型說明也使該函數(shù)具有全局的性質(zhì),其有效范圍是從說明處起到源文件結(jié)束。例如:inta;intf(intx,inty){intj;j=a;…}main(){intx,y;x=a;…}35.在同一個源文件中,全局變量可以和局部變量同名,局部變量將知識點2:變量的存儲類別1.C語言中,有兩種存儲類別:一種是自動類,一種是靜態(tài)類。2.局部變量既可以說明成自動類,也可以說明成靜態(tài)類。全局變量只能是靜態(tài)類。3.存儲類別有關(guān)的說明符:auto(自動)、register(寄存器)、static(靜態(tài))和extern(外部)。4.存儲類別說明符的說明形式:通常與類型名一起出現(xiàn),可以放在類型名左邊或右邊。例如:autointi,j;也可寫成intautoi,j;4知識點2:變量的存儲類別4知識點3:局部變量及其作用域和生存期1.auto變量當在函數(shù)內(nèi)部或復合語句內(nèi)定義變量時,如果沒有指定存儲類或使用了auto說明符,系統(tǒng)就認為所定義的變量具有自動類別。因此,floata;等價于autofloata;auto變量的存儲單元被分配在內(nèi)存的動態(tài)存儲區(qū)。每當進入函數(shù)體(或復合語句)時,系統(tǒng)自動為auto變量分配存儲單元。退出時自動釋放這些存儲單元。因此,這類局部變量的作用域是從定義的位置起,到函數(shù)體(或復合語句)結(jié)束為止。5知識點3:局部變量及其作用域和生存期5例如:sub(floata){inti;…if(i>0){intn;…printf(“%d\n”,n);}…}這里,變量i,a,n都是auto變量。但i和a的作用域是整個sub函數(shù);而n的作用域僅限于if子名內(nèi)。6例如:6生存期:所有自動類局部變量的存儲單元都是在進入這些局部變量所在的函數(shù)體(或復合語句)時生成,退出其所在的函數(shù)體(或復合語句)時消失。2.register變量寄存器變量也是自動類變量。它與auto變量的區(qū)別僅在于:用register變量是將變量的值保留在CPU的寄存器中,而不是象一般變量那樣,占內(nèi)存單元。特點:程序運行速度快,因為訪問寄存器比訪問內(nèi)存快。注意:(1)CPU中寄存器的數(shù)目有限,只能說明少量寄存器變量。(2)register變量的值存放在寄存器中,因此不能對register變量進行求地址運算。7生存期:所有自動類局部變量的存儲單元都是在進入這些局部變量所例:以下函數(shù)power用以計算xnmain(){ints;s=power(5,3);printf(“%d\n”,s);}power(intx,registerintn){registerintp;for(p=1;n;n--)p=p*x;returnp;}8例:以下函數(shù)power用以計算xn83.靜態(tài)存儲類的當在函數(shù)體(或復合語句)內(nèi)部,用static來說明一個變量時,可以稱該變量為靜態(tài)局部變量。靜態(tài)局部變量作用域與auto,register類的變量一樣。區(qū)別(1)在整個程序運行期間,靜態(tài)局部變量在內(nèi)存的靜態(tài)存儲區(qū)中占所著永久性的存儲單元。即使退出函數(shù)以后,下次再進入該函數(shù)時,靜態(tài)局部變量仍使用原來的存儲單元。由于并不釋放這些存儲單元,因此這些存儲單元中的值得以保留,由此可知,靜態(tài)局部變量的生存期將一直延長到程序運行結(jié)束。93.靜態(tài)存儲類的9(2)靜態(tài)局部變量的初值是在編譯時賦予的,在程序執(zhí)行期間不再賦予初值。對未賦初值的靜態(tài)局部變量,C編譯程序自動給它賦初值0.例:以下程序輸出結(jié)果intx=3;main(){inti;for(i=1;i<x;i++)incre();}intincre(){staticintx=1;x*=x+1;printf(“%d”,x);}A.33 B.22 C.26 D.2510(2)靜態(tài)局部變量的初值是在編譯時賦予的,在程序執(zhí)行期間不再知識點4:全局變量及其作用域和生存期全局變量只有靜態(tài)一種類別。對于全局變量可使用extern和static兩種說明符。1.全局變量的作用域和生存期全局變量是在函數(shù)外部任意位置上定義的變量,它的作用域是從變量定義的位置開始,到整個源文件結(jié)束止。例如:intsum;main(){…sum++;…}intfun1(){…sum++;…}inttest;intfun2(){…sum++;test=1;…}11知識點4:全局變量及其作用域和生存期11全局變量的生存期是整個程序的運行期間。若全局變量和某一函數(shù)中的局部變量同名,則在該函數(shù)中,此全局變量被屏蔽,在該函數(shù)內(nèi)訪問的是局部變量。例:有以下程序inta=3;main(){ints=0;{inta=5;s+=a++;}s+=a++;printf(“%d\n”,s);}程序運結(jié)果A.8 B.10 C.7 D.1112全局變量的生存期是整個程序的運行期間。若全局變量和某一函數(shù)中2.在同一編譯單位內(nèi)用extern說明符來擴展全局變量的作用域。當全局變量定義在后,引用它的函數(shù)在前時,應該在引用它的函數(shù)中用extern對此全局變量進行說明,以便通知編譯程序:該變量是一個已在外部定義了的全局變量,這時其作用域從extern說明處起,延伸到該函數(shù)末尾。fun1(){…}externintx;fun2(){inta;a=x;…}intx,y;main(){x=2;…}132.在同一編譯單位內(nèi)用extern說明符來擴展全局變量的作用3.靜態(tài)全局變量當用static說明符說明全局變量時,此變量可稱作“靜態(tài)”全局變量。靜態(tài)全局變量只限于本編譯單位使用,不能被其它編譯單位所引用。例:/*file1.c*//*file2.c*/staticintn;externintn;voidfunc();voidfunc()main(){printf(“%file2:%d\n”,);{n=5;…printf(“file1:%d\n”,n);}func();}143.靜態(tài)全局變量14知識點5:函數(shù)的類別所有函數(shù)都是外部的,因為不允許在函數(shù)內(nèi)部定義另一個函數(shù)。但當定義函數(shù)時,可以使用extern或static說明符。1.一般的函數(shù)都隱含說明符extern.此說明的特征是:可以被其他編譯單位中的函數(shù)調(diào)用。2.若在函數(shù)返回值的類型前加上說明符static,則稱此函數(shù)為“靜態(tài)”函數(shù)。此類函數(shù)的特征是:只限于本編譯單位的其他函數(shù)調(diào)用它,而不允許其他編譯單位中的調(diào)用它。15知識點5:函數(shù)的類別1512-1以下程序的輸出結(jié)果main(){inti=2,j=3;printf(“%d,”,i++);{inti=0;i+=j*2;printf(“%d,%d,”,i,j);}printf(“%d,%d\n”,i,j);}A.1,6,3,1,3 B.1,6,3,2,3 C.1,6,3,6,3 D.1,7,3,2,31612-1以下程序的輸出結(jié)果1612-2以下程序的輸出結(jié)果是intm=13;intfun2(intx,inty){intm=3;return(x*y-m);}main(){inta=7,b=5;printf(“%d\n”,fun2(a,b)/m);}A.1 B.2 C.7 D.101712-2以下程序的輸出結(jié)果是17第十三章編譯預處理和動態(tài)存儲分配在C語言中,凡是以”#“號開頭的行,都稱為“編譯預處理”命令行。在此之前我們常用的由#include,#define開始的程序行就是編譯預處理命令行。C語言預處理命令有:#undef,#if,#else等等。這些預處理命令組成的預處理命令行必須在一行的開頭以“#”號開始,每行的末尾不得加“;”。18第十三章編譯預處理和動態(tài)存儲分配在C語言中,凡是以”#“號開知識點1:不帶參數(shù)的宏定義1.不帶參數(shù)的宏定義命令行形式如下:#define宏名 替換文本或#define宏名例:#definePI3.14156對于以上例舉的宏名PI,在編譯時將把一串文本3.15156去替換源程序中的PI。(1)同一宏名不可重復定義。(2)替換文本不能替換雙引號中與宏名相同的字符串。例如,如果YES是已定義的宏名,則不能用與它相關(guān)的替換文本來替換printf(“YES”)中的YES.19知識點1:不帶參數(shù)的宏定義19(3)替換文本并不替換用戶標識符中的成分。例如,宏名YES,不會替換標識符YESORNO中的YES。(4)用作宏名的標識符通常用大寫字母表示,這并不是語法規(guī)定,只是一種習慣。(5)在C程序中,宏定義的定義位置一般寫在程序的開頭。20(3)替換文本并不替換用戶標識符中的成分。例如,宏名YES,知識點2:帶參數(shù)的宏定義1.帶參數(shù)的宏定義命令行形式如下:#define宏名(形參表)替換文本例:#defineMU(X,Y)((X)*(Y))…a=MU(5,2);b=6/MU(a+3,a);等價于a=((5)*(2));b=6/((a+3)*(a));21知識點2:帶參數(shù)的宏定義21(1)宏名和左括號之間不得有空格,形參之間用逗號隔開,替換文本中通常應包含有形參。(2)調(diào)用帶參的宏時,括號中實參的個數(shù)應與形參的相同。編譯時,編譯預處理程序用“替換文本”來替換宏名,用對應實參不加任何改動地替換“替換文本”中的形參。(3)宏調(diào)用和函數(shù)調(diào)用有相似之處,但宏調(diào)用由編譯預處理程序完成的,沒有計算過程。(4)宏調(diào)用中,實參不能替換括在雙引號中的形參。22(1)宏名和左括號之間不得有空格,形參之間用逗號隔開,替換文知識點3:文件包含1.文件包含命令可有以下兩種形式#include“文件名”#include<文件名>2.文件包含命令行的作用預編譯時,預編譯程序?qū)⒂弥付ㄎ募械膬?nèi)容來替換此命令行。如果文件名用雙引號括起來,系統(tǒng)先在源程序所在的目錄內(nèi)查找指定的包含文件,如果找不到,再按照系統(tǒng)指定的標準方式到有關(guān)目錄中去尋找。如果文件名用尖括號括起來,系統(tǒng)將直接按照系統(tǒng)指定的標準方式到有關(guān)目錄中去尋找。23知識點3:文件包含233.#include命令行應書寫在所用文件的開頭,因此也把包含文件稱作“頭文件”。頭文件名可以由用戶指定,其后綴不一定用“.h”。4.包含文件中,一般包含有一些公用的#define命令行、外部說明或?qū)Γ◣欤┖瘮?shù)的原型說明。例如:“stdio.h”就是這樣的文件。5.當包含文件修改后,對包含文件的源程序必須重新進行編譯連接。6.在一個程序中,允許有任意多個#include命令行。7.在包含文件中還可以包含其他文件。243.#include命令行應書寫在所用文件的開頭,因此也把包知識點4:動態(tài)存儲分配靜態(tài)存儲分配:我們用存儲數(shù)據(jù)的變量和數(shù)組都必須在說明部分進行定義。C編譯程序通過定義語句了解它們所需存儲空間大小,并預先為其分配適當?shù)膬?nèi)存空間。這些空間一經(jīng)分配,在變量或數(shù)組的生存期內(nèi)是固定不變的。動態(tài)存儲分配:在程序執(zhí)行期間需要空間來存儲數(shù)據(jù)時,通過“申請”分配指定的內(nèi)存空間。C為動態(tài)分配系統(tǒng)定義了四個函數(shù),它們是malloc,calloc,free和realloc。使用這些函數(shù)時,必須在程序開頭包含頭文件stdio.h。本書只介紹malloc,calloc和free函數(shù)的使用。25知識點4:動態(tài)存儲分配251.malloc函數(shù)其函數(shù)原型為void*malloc(unsignedint);malloc函數(shù)返回值的類型為void*,函數(shù)調(diào)用形式為:malloc(size)。要求size的類型為unsignedint。其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。如果此函數(shù)未能成功地執(zhí)行,則返回空指針(NULL)。我們知道int型占2字節(jié),float型占4字節(jié),則以下程序段將使pi指向一個int類型的存儲單元,使pf指向一個float類型的存儲單元。261.malloc函數(shù)26
int*pi;float*pf;pi=(int*)malloc(2);pf=(float*)malloc(4);由于malloc函數(shù)返回的地址為void*(無值型),故在調(diào)用函數(shù)時,必須利用強制類型轉(zhuǎn)換將其轉(zhuǎn)換成所需的類型。此處括號中的*號不可少,否則就轉(zhuǎn)換成普通變量類型而不是指針類型了。若不能確定數(shù)據(jù)類型所占字節(jié)數(shù),可以使用sizeof運算符來求得。例如:pi=(int*)malloc(sizeof(int));pf=(float*)malloc(sizeof(float));27int*pi;272.free函數(shù)其函數(shù)原型為voidfree(void*p);函數(shù)調(diào)用形式為:free(p);這里指針p必須指向由動態(tài)分配函數(shù)malloc分配的地址。free函數(shù)將指針p所指的存儲空間釋放,使這部分空間可以由系統(tǒng)重新支配。此函數(shù)沒有返回值。3.calloc函數(shù)其函數(shù)原型為void*calloc(unsignedn,unsignedsize);函數(shù)調(diào)用形式為:calloc(n,size);calloc函數(shù)用來給n個同一類型的數(shù)據(jù)項分配連續(xù)的存儲空間。每個數(shù)據(jù)項的長度為size個字節(jié)。若分配成功,函數(shù)返回存儲空間的首地址;否則返回空。由調(diào)用calloc函數(shù)所分配的存儲單元,系統(tǒng)自動置初值0。282.free函數(shù)28例如:char*ps;ps=(char*)calloc(10,sizeof(char));以上函數(shù)調(diào)用語句開辟了10個連續(xù)的char類型的存儲單元,由ps指向存儲單元的首地址。每個存儲單元可以存放一個字符。使用calloc函數(shù)開辟的動態(tài)存儲單元,同樣用free函數(shù)釋放。形式同malloc。29例如:29第十四章結(jié)構(gòu)體、共用體和用戶定義類型目前為止,我們已經(jīng)介紹了C語言中的基本類型(整型、字符型、實型、雙精度型和空值型)以入派生類型(指針和數(shù)組)。本章將介紹C語言中可由用戶構(gòu)造的三種數(shù)據(jù)類型。1.用戶定義類型(typedef):對已有的類型,另外說明一個新的類型標識符。2.結(jié)構(gòu)體(struct):把具有相互關(guān)系的不同類型的數(shù)據(jù)組成一個有機的整體。3.共用體(union):又稱聯(lián)合體。使幾種不同類型的變量共用一段存儲空間。30第十四章結(jié)構(gòu)體、共用體和用戶定義類型目前為止,我們已經(jīng)介紹了知識點1:用typedef說明一種新類型名用typedef說明一個新的類型標識符的一般形式如下:typedef類型名標識符;在此,“類型名”必須是已有類型標識符,“標識符”是一個用戶定義標識符,用作新的類型名。typedef語句的作用僅僅是用“標識符”來代表已存在的“類型名”,并未產(chǎn)生新的數(shù)據(jù)類型。原有類型名依然有效。例如:typedefintINTEGER;該語句把一個用戶命名的標識符INTEGER說明成了一個int類型的類型名。在此說明后,可以用INTEGER定義整型變量。如:INTEGERm,n;等價于intm,n;31知識點1:用typedef說明一種新類型名31又如:typedefchar*CHARP;CHARPp;等價于char*p;14-1若有以下說明和定義typedefint*INTEGER;INTEGERp,*q;以下敘述正確的是A.p是int型變量B.p是基類型為int的指針變量C.q是基類型為int的指針變量D.程序中可用INTEGER代替int類型名32又如:typedefchar*CHARP;3214-2若要說明一個類型名STP,使得定義語句STPs;等價于char*s;,以下選項中正確的是A.typedefSTPchar*s;B.typedef*charSTP;C.typedefSTP*char;D.typedefchar*STP;3314-2若要說明一個類型名STP,使得定義語句33知識點2:結(jié)構(gòu)體類型結(jié)構(gòu)體類型由若干個稱為成員的成分組成。對于某個具體的結(jié)構(gòu)體類型,成員的數(shù)量必須固定,這與數(shù)組相同;但該結(jié)構(gòu)體中各個成員的類型可以不同,這與數(shù)組區(qū)別。例如:我們常用的“日期”可由以下三部分描述:年(year),月(month),日(day)??梢园堰@三個成員組成一個整體,并給它取名為date,這就是一個簡單的結(jié)構(gòu)體。再如:以學生檔案為例,若包括如下數(shù)據(jù)項:姓名(name):字符串;性別(sex):字符型出生日期(birthday):date結(jié)構(gòu)體;四門課成績(sc):一維實型數(shù)組;可將這四個成員組成一個名為student的結(jié)構(gòu)體。34知識點2:結(jié)構(gòu)體類型341.結(jié)構(gòu)體類型說明的一般形式struct結(jié)構(gòu)體標識名{類型名結(jié)構(gòu)成員名;…};(1)struct是關(guān)鍵字,是結(jié)構(gòu)體類型的標志。(2)結(jié)構(gòu)體標識名是用戶定義的標識符.可以省略,構(gòu)成一個無名結(jié)構(gòu)體類型。(3)結(jié)構(gòu)體成員名是用戶定義標識符,可以與其他變量名和和其他結(jié)構(gòu)體中的成員名同名。(4)結(jié)構(gòu)體成員可以是簡單類型,數(shù)組,指針或已說明過的結(jié)構(gòu)體等(5)結(jié)構(gòu)體類型說明最后分號不可省略。351.結(jié)構(gòu)體類型說明的一般形式35例如:上述日期的結(jié)構(gòu)體類型可以說明如下:structdate{intyear,month,day;};上述學生檔案的結(jié)構(gòu)體類型可以說明如下:structstudent{charname[12];charsex;structdatebirthday;floatsc[4];};以上說明中,birthday成員的類型structdate是一個已說明過的結(jié)構(gòu)體類型。36例如:上述日期的結(jié)構(gòu)體類型可以說明如下:36若沒有事先說明這一類型,以上結(jié)構(gòu)體類型說明可改寫成如下形式:structstudent{charname[12];charsex;struct{intyear;intmonth;intday;}birthday;floatsc[4];};37若沒有事先說明這一類型,以上結(jié)構(gòu)體類型說明可改寫成如下形式:2.結(jié)構(gòu)體類型的變量、數(shù)組和指針變量的定義可以用以下四種方式定義結(jié)構(gòu)體類型的變量、數(shù)組和指針變量:(1)緊跟在結(jié)構(gòu)體類型說明之后進行定義。例:structstudent{charname[12];charsex;structdatebirthday;floatsc[4];}std,per[3],*pstd;此處在說明結(jié)構(gòu)體類型structstudent的同時,定義了一個結(jié)構(gòu)體變量std,具有3個元素的結(jié)構(gòu)體數(shù)組pers和基類型為結(jié)構(gòu)體類型的指針變量pstd。382.結(jié)構(gòu)體類型的變量、數(shù)組和指針變量的定義38變量std的結(jié)構(gòu)如圖具有這一結(jié)構(gòu)類型的變量中只能存放一組數(shù)據(jù)(即一個學生的檔案)。如果要存放多個學生的數(shù)據(jù),就要使用結(jié)構(gòu)體類型的數(shù)組。以上定義的數(shù)組pers就要以存放三名學生的檔案。它每一個元素都是一個structstudent類型的變量。以上定義的指針變量pstd可以指向具有structstudent類型的存儲單元,但目前還沒有具體的指向。39變量std的結(jié)構(gòu)如圖39(2)在說明一個無名結(jié)構(gòu)體類型的同時,直接進行定義。例如:以上定義的結(jié)構(gòu)體中可以把student略去,寫成:struct{charname[12];charsex;structdatebirthday;floatsc[4];}std,per[3],*pstd;這種方式與前一種的區(qū)別僅僅是省去了結(jié)構(gòu)體標識名。40(2)在說明一個無名結(jié)構(gòu)體類型的同時,直接進行定義。例如:以(3)先說明結(jié)構(gòu)體類型,再單獨進行變量定義。例如:structstudent{charname[12];charsex;structdatebirthday;floatsc[4];};structstudentstd,per[3],*pstd;41(3)先說明結(jié)構(gòu)體類型,再單獨進行變量定義。例如:41(4)使用typedef說明一個結(jié)構(gòu)體類型名,再用新類型名來定義變量。例如:typedefstruct{charname[12];charsex;structdatebirthday;floatsc[4];}STREC;STRECstd,pers[3],*pstd;此處STREC是一個具體的結(jié)構(gòu)體類型名。它能夠唯一的標識這種結(jié)構(gòu)體類型。因此,可用它來定義變量,如同使用int,char一樣,不可再寫關(guān)鍵字struct.42(4)使用typedef說明一個結(jié)構(gòu)體類型名,再用新類型名來3.給結(jié)構(gòu)體變量、數(shù)組賦初值(1)給結(jié)構(gòu)體變量賦初值所賦初值順序放在一對花括號中,例如:structstudent{charname[12];charsex;structdatebirthday;floatsc[4];}std={“LiMin”,”M”,1962,5,10,88,76,85,92};433.給結(jié)構(gòu)體變量、數(shù)組賦初值43賦初值后,變量std的內(nèi)容如圖對結(jié)構(gòu)體變量進行賦初值時,C編譯程序按每個成員在結(jié)構(gòu)體中的順序一一對應賦初值;不允許跳過前邊的成員給后面的成員賦初值;但可以只給前面的若干個成員賦初值,對于后面未賦初值的成員,對于數(shù)值型和字符型數(shù)據(jù),系統(tǒng)自動賦初值零。44賦初值后,變量std的內(nèi)容如圖44(2)給結(jié)構(gòu)體數(shù)組賦初值給結(jié)構(gòu)體數(shù)組賦初值的規(guī)則與給數(shù)組賦初值規(guī)則相同。只是由于結(jié)構(gòu)體數(shù)組中的每個元素都是一個結(jié)構(gòu)體,因此通常將其成員放在一對花括號中,以便區(qū)分各個元素.例如:structbookcard{charnum[];floatmoney;}bk[3]={{“NO.1”,35.5},{“NO.2”,38.0},{“NO.3”,35.5}};45(2)給結(jié)構(gòu)體數(shù)組賦初值454.引用結(jié)構(gòu)體變量中的數(shù)據(jù)(1)對結(jié)構(gòu)成員的引用若已定義了一個結(jié)構(gòu)體變量,和基類型為同一結(jié)構(gòu)體類型的指針變量,并使該指針指向同類型的變量,則可用以下三種形式來引用結(jié)構(gòu)體變量中的成員。結(jié)構(gòu)體變量名.成員名指針變量名->成員名(*指針變量名).成員名其中點號為成員運算符;箭頭為結(jié)構(gòu)指向運算符;在第三種形式中,一對圓括號不可少。464.引用結(jié)構(gòu)體變量中的數(shù)據(jù)46例:structstudent{charname[12];charsex;structdatebirthday;floatsc[4];}std,arr[5],*ps;ps=&std;若要引用結(jié)構(gòu)體變量std中的sex成員,可寫作:std.sex通過結(jié)構(gòu)體變量引用ps->sex通過指針變量引用(*ps).sex通過指針變量引用47例:47若要引用結(jié)構(gòu)體數(shù)組arr的第0個元素arr[0]中的sex成員,可寫作arr[0].sex。不能寫成arr.sex。若要引用結(jié)構(gòu)體變量std中數(shù)組成員sc中的元素sc[2]時,可寫作std.sc[2]或ps->sc[2]或(*ps).sc[2]或arr[0].sc[2]。不能寫成std.sc。若結(jié)構(gòu)體變量中的成員是作為字符串使用的字符型數(shù)組,如結(jié)構(gòu)體中的成員name,由于可以將其看作“字符串變量”,因此其引用形式可以是或ps->name或(*p).name或arr[0].name.48若要引用結(jié)構(gòu)體數(shù)組arr的第0個元素arr[0]中的sex成內(nèi)嵌結(jié)構(gòu)體變量成員的引用訪問結(jié)構(gòu)體變量中各內(nèi)嵌結(jié)構(gòu)體成員時,必須逐層使用成員名定位。例如:引用結(jié)構(gòu)體變量std中的出生年份時,可寫作std.birthday.year或ps->birthday.year或(*ps).birthday.year或arr[0].birthday.year。注意birthday不能用->運算符,因為birthday不是指針變量。.(2)對結(jié)構(gòu)體變量中的成員進行操作結(jié)構(gòu)體變量中的每個成員都屬某個具體的數(shù)據(jù)類型。因此,對結(jié)構(gòu)體變量中的每個成員,都可以象普通變量一樣,對它進行同類變量所允許的任何操作。例:變量std中的成員是字符串型,可以對它進行任何字符串允許的操作。49內(nèi)嵌結(jié)構(gòu)體變量成員的引用49若有定義:structstudentstd,pers[5],*pstd;pstd=&std;以下對相應變量中的name成員所進行的操作合法。scanf(“%s”,);或gets();scanf(“%s”,pstd->name);或gets(pstd->name);for(i=0;i<3;i++)scanf(“%s”,pers[i].name);strcpy(,”LiMin”);注不能寫成=“LiMin”;因為成員name為數(shù)組,不能直接用賦值語句賦字符串。50若有定義:50以下對相應變量中的sex成員進行操作:scanf(“%c”,&std.sex);或std.sex=getchar();scanf(“%c”,&pstd->sex);或std->sex=getchar();for(i=0;i<3;i++)scanf(“%c”,&pers[i].sex);std.sex=‘M’;以下對相應變量中birthday成員中year進行操作scanf(“%d”,&std.birthday.year);scanf(“%d”,&pstd->birthday.year);for(i=0;i<3;i++)scanf(“%d”,&pers[i].birthday.year);std.birthday.year=1962;51以下對相應變量中的sex成員進行操作:51以下對相應變量中成員數(shù)組sc中的元素進行操作for(j=0;j<5;j++)scanf(“%f”,&std.sc[j]);for(j=0;j<5;j++)scanf(“%f”,&pstd->sc[j]);for(i=0;i<3;i++)for(j=0;j<5;j++){scanf(“%f”,&std.sc[j];pers[i].sc[j]=std.sc[j];}52以下對相應變量中成員數(shù)組sc中的元素進行操作52與++,--運算符組成表達式時,應當根據(jù)運算符的優(yōu)先級別來確定表達式的含義。例如:struct{inta;char*s;}x,*p=&x;其中變量x的成員a,指針成員s已正確賦值,則表達:++p->a等價于++(p->a)使得a增1,因為運算符->的優(yōu)先級高于++。若要在訪問a之前使p增1,應當寫成(++p)->a或p++->a。53與++,--運算符組成表達式時,應當根據(jù)運算符的優(yōu)先級別來確相同類型結(jié)構(gòu)體變量之間的整體賦值struct{charname[10];intnum;}per1,per2={“YANGGM”,46};執(zhí)行語句:per1=per2;后,per2中每個成員的值都賦給了per1中對應的同名成員。這種方法必須保證賦值號兩邊結(jié)構(gòu)體變量的類型相同。54相同類型結(jié)構(gòu)體變量之間的整體賦值545.函數(shù)之間結(jié)構(gòu)體變量的數(shù)據(jù)傳遞(1)向函數(shù)傳遞結(jié)構(gòu)體變量的成員在前面指出:結(jié)構(gòu)體變量中的每個成員可以是簡單變量、數(shù)組或指針變量等,作為成員變量,它們可以參與所屬類型允許的任何操作。這一原則在參數(shù)傳遞中仍適用。(2)向函數(shù)傳遞結(jié)構(gòu)體變量結(jié)構(gòu)體變量可作為實參將結(jié)構(gòu)體變量的值傳送給相應的形參。(3)傳遞結(jié)構(gòu)體的地址將結(jié)構(gòu)體變量的地址作為實參傳遞給形參,這時對應的形參應該是一個基類型相同的結(jié)構(gòu)體類型的指針。555.函數(shù)之間結(jié)構(gòu)體變量的數(shù)據(jù)傳遞55例:通過函數(shù)給結(jié)構(gòu)體成員賦值typedefstruct{cahrs[10];intt;}ST;getdata(ST*p)形參為結(jié)構(gòu)體類型的指針變量{scanf(“%s%d”,p->s,&p->t);}main(){STa;getdata(&a);結(jié)構(gòu)體變量的地址作實參printf(“%s,%d\n”,a.s,a.t);}56例:通過函數(shù)給結(jié)構(gòu)體成員賦值56(4)函數(shù)的返回值是結(jié)構(gòu)體類型書上例14.2通過函數(shù)返回結(jié)構(gòu)體類型的值。(5)函數(shù)的返回值可以是指向結(jié)構(gòu)體變量的指針類型。書上例14.3、14.457(4)函數(shù)的返回值是結(jié)構(gòu)體類型576.利用結(jié)構(gòu)體變量構(gòu)成鏈表(1)鏈表概述鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu)。它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)。如圖表示最簡單的一種鏈表的結(jié)構(gòu).鏈表有一個“頭指針”變量,圖中以head表示,它存放一個地址。該地址指向一元素。鏈表中每一個元素稱為“結(jié)點”,每個結(jié)點都應包括兩個部分:一為用戶需要用的實際數(shù)據(jù),二為下一個結(jié)點的地址??梢钥闯?,head指向第一個元素;第一個元素又指向第二個元素…直到最后一個元素,稱它為“表尾”,且地址部分為“NULL”。586.利用結(jié)構(gòu)體變量構(gòu)成鏈表58可以看到鏈表中各元素在內(nèi)存中可以不是連續(xù)存放的。要找某一元素,必須先找到上一個元素,根據(jù)它提供的下一元素地址才能找到下一個元素。如果不提供“頭指針”(head),則整個鏈表都無法訪問。這種鏈表的數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實現(xiàn)。即:一個結(jié)點中應包含一個指針變量,用于存放下一結(jié)點的地址。前面介綠了結(jié)構(gòu)體變量,用它作鏈表中的結(jié)點是最合適的。一個結(jié)構(gòu)體變量包含若干成員,這些成員可以是數(shù)值類型、字符類型、數(shù)組類型,也可以是指針類型。我們用這個指針類型成員來存放下一個結(jié)點的地址。例如:59可以看到鏈表中各元素在內(nèi)存中可以不是連續(xù)存放的。要找某一元素
structstudent{intnum;floatscore;structstudent*next;};其中成員num和score用來存放結(jié)點中的有用數(shù)據(jù),相當于上圖結(jié)點中的A,B,C,D。next是指針類型的成員,它指向structstudent類型數(shù)據(jù)。一個指針類型的成員既可以指向其他類型的結(jié)構(gòu)體數(shù)據(jù),也可以指向自己所在結(jié)構(gòu)體類型的數(shù)據(jù)?,F(xiàn)在,next是structstudent類型中的一個成員,它又指向structstudent類型的數(shù)據(jù)。用這種方法就可以建立鏈表。60structstudent60如果所示圖中每個結(jié)點都屬于structstudent類型,它的成員next存放下一結(jié)點的地址,程序設(shè)計人員可以不必具體知道各結(jié)點的地址,只要保證將下一個結(jié)點的地址放到前一結(jié)點的成員next中即可。這種從當前結(jié)點找到后繼結(jié)點的鏈表,稱為“單向鏈表”。61如果所示61例:建立一個如上圖所的鏈表,它由4個學生數(shù)據(jù)的結(jié)點組成,并輸出各結(jié)點中的數(shù)據(jù)。#defineNULL0structstudent{longnum;floatscore;structstudent*next;};main(){structstudenta,b,c,d,*head,*p;a.num=99101;a.score=89.5;b.num=99103;b.score=90;c.num=99105;c.score=85;d.num=99107;d.score=80;head=&a;a.next=&b;b.next=&c;c.next=&d;d.next=NULL;p=head;do{printf(“%ld,%5.1f\n”,p->num,p->score);p=p->next;}while(p!=NULL);}62例:建立一個如上圖所的鏈表,它由4個學生數(shù)據(jù)的結(jié)點組成,并輸(2)在單向鏈表中插入結(jié)點在單鏈表中插入結(jié)點,首先要確定插入的位置。當插入結(jié)點插在指針p所的結(jié)點之前稱為“前插”,當插入結(jié)點插在指針p所指的結(jié)點之后稱為“后插”。如圖所示“前插”操作過程中各指針的指向。當進行“前插”操作時,需要三個工作指針:圖中用s來指向新開辟的結(jié)點;用p指向插入的位置;q指向s的前趨結(jié)點。s->next=p;q->next=s;63(2)在單向鏈表中插入結(jié)點63(3)刪除單向鏈表中的結(jié)點為了刪除單向鏈表中的某個結(jié)點,首先要找到待刪結(jié)點的前趨結(jié)點;然后將此前趨結(jié)點的指針去指向待刪結(jié)點的后續(xù)結(jié)點;最后釋放被刪結(jié)點所占存儲空間即可。如圖所示刪除結(jié)點操作。q->next=p->next;64(3)刪除單向鏈表中的結(jié)點64知識點3:共用體共用體的類型說明和變量的定義方式和結(jié)構(gòu)體的類型說明和變量定義的方式完全相同,不同的是,結(jié)構(gòu)體變量中的成員各自占有自己的存儲空間,而共用體變量中的所有成員占有同一個存儲空間。1.共用體類型的說明和變量定義(1)共用體類型的說明一般形式:union共用體名{類型名共用體成員名;…};65知識點3:共用體65例如:unionun_1{inti;floatx;charch;};其中union是關(guān)鍵字,是共用體類型的標志。un_1是共用體名,“共用體名”和“共用成員名”都是由用戶定義的標識符,按語法規(guī)定,共用體名是可選項,在說明中可以不出現(xiàn)。共用體中的成員可能是簡單變量,也可以是數(shù)組、指針、結(jié)構(gòu)體和共用體(結(jié)構(gòu)體的成員也可以是共用體)。66例如:66(2)共用體變量的定義和結(jié)構(gòu)體相似,共用體變量的定義也可以采用四種方式。取其一示例如下:unionun_1{inti;floatx;}s1,s2,*p;這里變量s1的存儲空間如圖所示67(2)共用體變量的定義67說明:共用體類型變量的定義,在形式上與結(jié)構(gòu)體非常相似,但它們是有本質(zhì)區(qū)別的:結(jié)構(gòu)體中的每個成員分別占有獨立的存儲空間,因此結(jié)構(gòu)體變量所占內(nèi)存字節(jié)數(shù),是其成員所占字節(jié)數(shù)的總和;而共用體變量中的所有成員共享一段公共存儲區(qū),所以共用體變量所占內(nèi)存字節(jié)數(shù)與其成員中占字節(jié)數(shù)最多的那個成員相等。若int型占2字節(jié),float型占4字節(jié),則以上定義的共用體變量占4字節(jié),而不是6字節(jié)。由于共用體變量中的所有成員共享存儲空間,因此變量中的所有成員的首地址相同,而且變量的地址也就是該變量成員的地址。例如:&s1==&s1.i==&s1.x。68說明:682.共用體變量的引用(1)共用體變量中成員的引用共用體變量中每個成員的引用方式與結(jié)構(gòu)體完全相同??梢允褂靡韵氯N形式之一:共用體變量名.成員名指針變量名->成員名(*指針變量名).成員名例如:若s1,s2,p的定義如前,且有p=&s1:,則s1.i,s1.x,或p->i,p->x,(*p).i,(*p).x都是合法的引用形式。共用體中的成員變量同樣可參與其所屬類型允許的任何操作。但在訪問共用體成員時應注意:共用體變量中起作用的是最近一次存入的成員變量的值,原有成員變量的值將被覆蓋。692.共用體變量的引用69例如:unionun_1{inti;intx;}s1;main(){s1.x=123;s1.i=100;printf("%d\n",s1.x);}70例如:70(2)共用體變量的整體賦值例如:s1.i=5;s2=s1;printf(“%d\n”,s2.i);輸出的值為5.(3)向函數(shù)傳遞共用體變量的值同結(jié)構(gòu)體變量一樣,共用體類型的變量可以作為實參進行傳遞,也可以傳送共用體變量的地址。例如:利用共用體類型的特點分別取出int變量中高字節(jié)和低字節(jié)中的兩個數(shù)。71(2)共用體變量的整體賦值71
unionchange{charc[2];inta;}un;main(){un.a=16961;printf(“%d,%c\n”,un.c[0],un.c[0]);printf(“%d,%c\n”,un.c[1],un.c[1]);}共用體變量un中包含兩個成員:字符數(shù)組c和整數(shù)變量a,它們恰好都占兩個字節(jié)的存儲單元。由于是共用存儲單元,給un的成員a賦值后,內(nèi)存中數(shù)據(jù)的存儲情況如圖所示72unionchange72當給成員un.a賦16961后,系統(tǒng)將按int整型把數(shù)存放到存儲空間中:分別輸出un.c[1],un.c[0]即完成把一個int整型數(shù)分別按高字節(jié)和低字節(jié)輸出。7373第十五章位運算知識點1:位運算符1.位運算符及功能運算符含義優(yōu)先級~按位求反1<<左移2>>右移2&按位與3^按位異或4|按位或574第十五章位運算知識點1:位運算符運算符含義優(yōu)先級~按位求反1知識點2:位運算符的運算功能1.“按位取反”運算(~)功能:是將把運算對象的內(nèi)容按內(nèi)容取反:即每一位上的0變1;1變0。例如:表達式~0115是將八進制數(shù)115按位求反。由于是“位”運算,為了直觀起見,我們把運算對象直接用二進制形式表示:~01001101
結(jié)果1011001075知識點2:位運算符的運算功能752.“左移”運算(<<)左移運算符是雙目運算符。運算符左邊是移位對象;右邊是整型表達式,代表左移的位數(shù)。左移時,右端(低位)補0;左端(高位)移出的部分舍棄。例如:chara=6,b;b=a<<2;用二進制數(shù)來表示運算過程如下:a:00000110(a=6)b=a<<2:00011000762.“左移”運算(<<)763.“右移”運算(>>)右移運算符使用方法與左移運算符一樣,所不同的是移位方向相反。右移時,右端(低位)移出的二進制數(shù)舍棄;左端(高位)移入的二進制數(shù)分兩種情況:對于無符號整數(shù)和正整數(shù),高位補0;對于負整數(shù),高位補1。這是因為負數(shù)在機器內(nèi)均用補碼表示。例如:inta=-714000,b;用二進制數(shù)表示的運算過程如下:符號位a的二進制原碼表示:1111001100000000a的二進制補碼表示:1000110100000000b=a>>2:1110001101000000(b的補碼)b的二進制原碼表示:1001110011000000b的八進制婁:-016300773.“右移”運算(>>)774.“按位與”運算(&)運算符&的功能:把參加運算的兩個運算數(shù),按對應的二進制位分別進行“與”運算,當兩個相應的位都為1時,該位的結(jié)果為1;否則為0.例如,表達式12&10的運算如下:12:00001100&10:00001010結(jié)果:00001000784.“按位與”運算(&)785.“按位異或”運算(^)異或運算的功能:參與運算的兩個運算數(shù)中相對應的二進制位上,若數(shù)相同,則該位的結(jié)果為0;數(shù)不同,則該位的結(jié)果為1。例如:00110011^11000011結(jié)果:11110000795.“按位異或”運算(^)796.“按位或”運算(|)按位“或”運算功能:參加運算的兩個運算數(shù)中,只要兩個相應的二進制位中有一個為1,該位的運算結(jié)果即為1;只有當兩個相應位的數(shù)都為0時,該位的運算結(jié)果才為0。例如:0123:01010011014:00001100結(jié)果:01011111806.“按位或”運算(|)80第十六章文件知識點1:文件指針文件指針,實際上是指向一個結(jié)構(gòu)體類型的指針變量;這個結(jié)構(gòu)體中包含有諸如:緩沖區(qū)的地址、在緩沖區(qū)中當前存取的字符的位置、對文件是“讀”還是“寫”、是否已經(jīng)遇到文件結(jié)束標志等信息。我們不必去了解其中的細節(jié),所有一切都在stdio.h頭文件中進行了定義;并稱此結(jié)構(gòu)體類型名為FILE,可以用此類型名來定義文件指針。定義文件類型指針變量的一般形式為:FILE*指針變量名;例如:FILE*fp1,*fp2;fp1,fp2均被定義為指向文件類型的指針變量,稱為文件指針。81第十六章文件知識點1:文件指針81知識點2:打開文件1.fopen函數(shù)。用于打開文件。(1)調(diào)用形式如下:FILE*fp;fp=fopen(文件名,文件使用方式);例如:fp=fopen(“C:\\abc.dat”,”w”);,打開C盤上的文件abc.dat,并對此文件可進行“寫”操作。文件名和使用方式都用字符串表示。(2)應當熟悉常用文件使用方式的表示方式和功能,如下表:82知識點2:打開文件82使用方式含義(用于文本文件)使用方式含義(用于二進制文件)“r”(只讀)為讀而打開文本文件“rb”(只讀)為讀打開二進制文件“w”(只寫)為寫而打開文本文件“wb”(只寫)為寫建立新二進制文件“a”(追加)向文本文件尾添加數(shù)據(jù)“ab”(追加)向二進制文件尾添加數(shù)據(jù)“r+”或“rw”(讀寫)為讀/寫而打開文本文件“rb+”(讀寫)為讀/寫打開二進制文件“w+或“wr”(寫讀)為寫/讀建立新文本文件“wb+”(寫讀)為寫/讀建立新二進制文件“a+或“ar”(寫讀)為添加/讀打開文本文件“ab+”(寫讀)為添加/讀打開二進制文件83使用方式含義(用于文本文件)使用方式含義(用于二進制文件)“知識點4:關(guān)閉文件當文件的讀(寫)操作完成這后,必須將它關(guān)閉。關(guān)閉文件可調(diào)用庫函數(shù)fclose來實現(xiàn),fclose函數(shù)的調(diào)用形式如下:fclose(文件指針)fclose(fp);,其中fp已指向某文件。fclose函數(shù)作用是使文件指針fp與所指文件脫離聯(lián)系,并由系統(tǒng)妥善處理該文件緩沖區(qū)的重要剩余數(shù)據(jù)。84知識點4:關(guān)閉文件84知識點5:文件輸入和輸出函數(shù)當成功地打開文件之后,接下來的事情就是對文件進行輸入或輸出操作。1.調(diào)用putc(或fputc)函數(shù)輸出一個字符putc函數(shù)的調(diào)用形式如下“putc(ch,fp);ch是待輸出的某個字符,可以是一個字符常量,也可以是一個字符變量。fp是文件指針。功能是將字符ch寫到文件指針fp所指的文件中去。成功則返回所輸出的字符;失敗返回一個EOF值。EOF是stdio.h庫函數(shù)文件中定義的符號常量,其值等于-1.fputc函數(shù)的調(diào)用形式和函數(shù)的功能與putc函數(shù)完全相同。85知識點5:文件輸入和輸出函數(shù)85例:把從鍵盤輸入的文本按原樣輸出到名為file_a.dat文件中,用字符作為鍵盤輸入結(jié)束標志。操作步驟:1.打開文件;2.從鍵盤輸入一個字符。3.判輸入的字符是否是字符,若是,結(jié)束循環(huán),執(zhí)行步驟(7)。4.把剛輸入的字符輸出到文件中。5.從鍵盤輸入一個字符。6.重復步驟(3)和(5)。7.關(guān)閉文件。8.程序結(jié)束。#include“stdio.h”main(){FILE*fpout;charch;if((fpout=fopen(“fele_a.dat”,”w”))==NULL){printf(“Can’topenthisfile!\n”);exit(0);}ch=getchar();while(ch!=‘’){fputc(ch,fpout);ch=getchar();}fclose(fpout);}86例:把從鍵盤輸入的文本按原樣輸出到名為file_a.dat文2.調(diào)用getc(或fgetc)函數(shù)輸入一個字符getc函數(shù)的調(diào)用形式如下:ch=getc(pf);此處pf是文件指針;函數(shù)的功能是從pf指定的文件中讀入一個字符,并把它作為函數(shù)值返回。以上表達式中g(shù)etc函數(shù)把文件中講稿的一個字符賦給變量ch。fgetc函數(shù)的調(diào)用形式和函數(shù)的功能與getc函數(shù)完全相同。例:把一個已存在磁盤上的file_a.dat文本文件中的內(nèi)容,原樣輸出到終端屏幕上。872.調(diào)用getc(或fgetc)函數(shù)輸入一個字符87步驟:1.打開文件。2.從指定文件中講稿一個字符。3.讀入的是否是文件結(jié)束標志;若是,結(jié)束循環(huán),執(zhí)行步驟(7)。4.把剛輸入的字符輸出到終端屏幕。5.從文件中再讀入一個字符。6.重復步驟(3)和(5)。7.關(guān)閉文件。8.程序結(jié)束。#include“stdio.h”main(){FILE*fpin;charch;if((fpin=fopen(“file_a.dat”,”r”))==NULL){printf(“Can’topenthisfile!\n”);exit(0);}ch=fgetc(fpin);while(ch!=EOF){putchar(ch);ch=fgetc(fpin);}fclose(fpin);}88步驟:1.打開文件。2.從指定文件中講稿一個字符。3.讀入的知識點6:文件結(jié)束的標志文本文件可用預定義符EOF作為文件結(jié)束標志。當把數(shù)據(jù)以二進制形式存放到文件中時,就會有-1值出現(xiàn),因此不能采用EOF作為二進制文件的結(jié)束標志。為解
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京市崇文區(qū)2025屆數(shù)學四下期末教學質(zhì)量檢測模擬試題含解析
- 西安石油大學《泌尿、生殖與內(nèi)分泌系統(tǒng)醫(yī)學教程》2023-2024學年第二學期期末試卷
- 四平職業(yè)大學《設(shè)計基礎(chǔ)》2023-2024學年第二學期期末試卷
- 棗莊科技職業(yè)學院《職前與就業(yè)訓練》2023-2024學年第二學期期末試卷
- 2025年全球光纖行業(yè)深度洞察:市場規(guī)模達480億美元 技術(shù)創(chuàng)新重塑產(chǎn)業(yè)格局
- N1叉車司機模擬試題及答案
- 頂樓樓梯欄桿施工方案
- 公墓改造現(xiàn)場施工方案
- 2025年科目一公路試題及答案
- 分體空調(diào)施工方案
- 2025年孝感貨運從業(yè)資格考試
- 防災避險安全應急知識培訓課件
- 2023年新高考全國Ⅱ卷語文真題(解析版)
- 2025屆西北四省(山西、陜西、青海、寧夏)高三下學期第一次聯(lián)考英語試題
- 中考生物總復習《用藥、急救與健康地生活》專項測試題及答案
- 2.2學會管理情緒 課件 -2024-2025學年統(tǒng)編版道德與法治七年級下冊
- 加油站常見安全隱患
- 2025年醫(yī)院基本公共衛(wèi)生服務項目工作計劃
- 2025年福建能化集團招聘筆試參考題庫含答案解析
- 江蘇省中小學生金鑰匙科技競賽(高中組)考試題及答案
- 《異常子宮出血診斷與治療指南(2022更新版)》解讀
評論
0/150
提交評論